Redis-笔记1
Redis学习笔记第一部分,关于redis的安装配置、常用命令和数据类型及其应用场景
1.redis安装及配置
下载
访问Reids官网进行下载,下载完成后将压缩包传入linux虚拟机中的 /opt/ 文件夹下
解压
进入/opt/中,解压
1 | tar -zxvf redis-7.2.1.tar.gz |
安装
进入redis-7.2.1的文件夹中,执行make命令
1 | cd /opt/redis-7.2.1/ |
进入后
1 | make && make install |
等待安装完成即可
默认安装位置在 /usr/local/bin 下
/usr/local/ 相对于 Windows的C:/Program Files
修改配置文件
进入redis-7.2.1的文件夹,可以看到名为 redis.conf 的配置文件。保险起见,不在这个文件上进行修改,将这个文件复制到一个自定义的地方,在复制文件中进行修改
1 | mkdir /myredis |
执行完以上命令后,进入redis7.conf进行修改
1 | cd /myredis/ |
修改以下4处地方
输入 / + 关键字 可以在全文范围内搜索,**:set nu显示行号, 按 n 跳转到下一个关键词,按 i 进行插入,Esc退出编辑,输入:wq** 保存并退出文件
启动redis
输入命令
1 | redis-server /myredis/redis7.conf |
查看redis的进程
1 | ps -ef|grep redis|grep -v grep |
连接redis
连接redis用以下命令,其中 -a 指Authentication required(身份验证),后面接着配置文件中设置的密码。**-p**指指定端口号,不写的话默认为6379
1 | redis-cli -a 123456 -p 6379 |
注意当客户端需要使用中文时,会出现中文乱码,所以可以在后面加上 –raw
1 | redis-cli -a 123456 -p 6379 --raw |
重开一个终端窗口,再次查看进程可以看到已经存在一个连接了
连接上redis后,输入ping,正常的话会显示PONG
退出、关闭和卸载redis
如果需要退出客户端,输入quit
如果需要关闭客户端,输入shutdown,也可以在redis外输入redis-cli -a 123456 shutdown
如果需要卸载redis,首先需要停止redis-server服务,然后删除 /usr/local/lib下有关redis的文件
1 | rm -rf /usr/local/bin/redis-* |
2.关于Key的常用命令
set k1 va1
- 插入一个key为k1,value为v1的数据
**keys ***
- 查看当前库的所有key
exists key
- 判断是否存在某个key
tpye key
- 查看该key是什么类型
del key
- 删除指定的key数据
unlink key
- 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作
ttl key
- 查看还有多少秒过期,-1代表永不过期,-2代表已过期
expire key 秒钟
- 给key设定过期时间
move key 0~15
- 将当前数据库的key移动到给定的数据库中
select 0~15
- 切换数据库(0~15),默认为0
dbsize
- 查看当前数据库key的数量
flushdb
- 清空单腔库
flushall
- 清空所有库
3.十大类型之 String
set key value
设置键值
以下是可选参数
[ NX | XX ]
带上NX代表:若键存在则命令无效,不存在则设置键值
带上XX代表:若键存在则进行覆盖,不存在则设置键值
[ GET ]
带上GET代表将原本的值返回,若不存在则返回nil,最后用新值覆盖旧值
[ EX | PX | EXAT | PXAT | KEEPTTL ]
EX: 以秒为单位设置过期时间
PX: 以毫秒为单位设置过期时间
EXAT: 设置以秒为单位的UNIX时间戳所对应的时间为过期时间
PXAT: 设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
KEEPTTL: 保留键在更改前所带的生存时间(因为默认情况下,当键的值发生更改时,其生存时间也会默认变为-2,即永不过期,所以在对键进行修改时带上keepttl就可以保留其原来的生存时间)
mset | mget | msetnx
mset k1 v1 k2 v2 k3 v3:同时设置多个键
mget k1 k2 k3:同时获取多个键
**msetnx k1 k4 k5 k6 **:
键不存在的情况下设置多个键,需要注意的是msetnx中只要有一个是已存在的,那么所有对键的设置都不会执行,比如这里k1已经存在,则k4 k5 k6都不会被设置
getrange | setrange
getrange k1 start end : 取k1中索引为start和end范围内的值
setrange k1 start end:设置k1中索引为start和end范围内的值
incr | incrby | decr | decrby
incr 数值递增、incrby 增加指定数值、decr 数值递减、decrby 减少指定数值
strlen | append
strlen k1 :获取k1长度
append k1 v1:在k1后追加v1
getset
getset k1 v1 等同于 set k1 v1 get
应用场景
缓存数据:将经常使用的数据存储在 Redis 中,可以提高访问速度。
计数器:可以使用 Redis 的incr命令实现计数器功能,如统计点赞量、浏览量
4.十大类型之 List
Redis 中的 list 底层由双向链表实现,所以可以从两侧进行插入的操作,主要功能有 push / pop
lpush | rpush | lrange
lpush list1 1 2 3 4 5 :从list1的头部插入1 2 3 4 5
rpush list2 11 22 33 44 55 :从list2的尾部插入11 22 33 44 55
lrange list1 0 -1:从头部遍历list1,只有 lrange 没有 rrange
lpop | rpop
类似于队列,lpop是删除队头元素并返回,rpop删除队尾元素并返回
**lindex **
lindex list index :获取list中索引为index的元素
llen
llen list : 获取list的长度
lrem
lrem 中rem可以指remove,list是列表名 ,n是指要删除多少个,v1是指一个有重复的值
这条命令可以理解为 删除list中n个值为v1的元素
lrem list1 4 1 :删除list1中的4个1
ltrim
ltrim list1 1 6 :截取list1中索引为1和6之间的内容
rpoplpush
rpoplpush list1 list2 :从list1的尾部删除一个元素,并将该元素插入到list2的头部
lset
lset list1 1 abcd :将list1中索引为1的元素设为abcd
linsert
linsert list1 before 3 java :在 list1 中找到 3 这个元素,并在其前面插入一个java
before 也可以是 after , 即在指定位置的后面插入
如果list中有重复的值,那么只会在查找到的第一个值前后插入
应用场景
消息列表:微博、微信朋友圈、公众号等
5.十大类型之 Hash
hset | hget
与String类似
hset user:001 id 01 name z3 age 18:为user:001的id赋值为01,name为z3,age为18
hset可以批量赋值,所以后来hmset已经被视为弃用了
hget user:001 id:获取user:001的id
hmget
hmget user:001 id name age : 同时获取user:001的id,name和age
hgetall
hgetall user:001 : 遍历user:001
hdel
hdel user:001 age : 删除user:001的age
hlen
hlen user:001 : 获取user:001内的key的数量
hexists
hexists user:001 id : 判断user:001是否存在id. 是则返回1,否则返回0
hkeys | hvals
hkeys user:001 : 获取user:001内所有的key
hvals user:001 : 获取user:001内所有的value
hincrby | hincrbyfloat
hincrby user:001 age 2 : 给user:001的age增加2
hincrbyfloat user:001 score 0.5 : 给user:001的score增加0.5
注意当一个值为浮点型时,只能用hincrbyfloat进行增加
但反之如果是整型,仍然可以使用hincrbyfloat
hsetnx
hsetnx user02 id 02 : 当id不存在时,设定user02的id为02,若存在则命令无效
应用场景
系统中对象数据的存储如:电商系统购物车、用户信息等
6.十大类型之 Set
sadd
sadd set1 1 1 1 1 2 3 4 5 : 给set1插入1,2,3,4,5 , 其中重复的元素只会插入一次
smembers
smembers set1 : 遍历set1的所有元素
sismember
sismember set1 1 :判断1是否为set1中的元素,是则返回1,否则为0
srem
srem set1 1 2 3 : 删除set1中的1,2,3. 返回成功删除的个数
scard
scard set1 : 获取set1中的元素个数
srandmember
srandmember set2 3 : 随机展示set2中的3个元素,不会删除元素
spop
spop set2 2 : 随机弹出set2中的2个元素,出一个删一个
smove
smove set1 set2 6 : 将set1中的6移动到set2
sdiff | sunion | sinter
sdiff set1 set2 : 返回 set1 - set2 的差集
sunion set1 set2 : 返回 set1 和 set2 的并集
sinter set1 set2 : 返回 set1 和 set2 的交集
sintercard
sintercard 2 set1 set2 limit 10 : 返回 set1 和 set2 这 2 个集合交集的元素个数,最大值为10
应用场景
抽奖:spop、srandmember都可以随机获取元素
可能认识的人、同赞好友:通过集合运算得到交集、并集等
7.十大类型之 Zset
zadd
zadd zset1 60 n1 70 n2 65 n3 : 给zset1中添加元素及其分数,n1分数60,n2分数70,n3分数65
zrange | zrevrange
zrange zset1 0 -1: 遍历zset1
**zrevrange zset1 0 -1 **:倒序遍历zset1
zrangebyscore
zrangebyscore zset1 60 65: 根据60-65的区间,返回zset1在此区间范围内的元素
zrangebyscore zset1 60 65 withscores: withscore连同分数是多少一起返回
zrangebyscore zset1 (60 (65 withscores: (60 (65指不包含60和65
zrangebyscore zset1 (60 (65 withscores limit 0 2 : limit 0 2 指从0开始,只取2个元素
zscore
zscore zset1 n1: 获取zset1中n1的分数
zcard
zcard zset1: 获取zset1中的元素个数
zrem
zrem zset1 n1: 删除zset1中的n1
zincrby
zincrby zset1 10 n2: 给zset1中的n2分数增加10
zcount
zcount zset1 60 70 : 获取zset1中分数在60到70间的元素个数
zmpop
从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对。
zmpop 2 set set1 min count 4 : 弹出 set (第一个非空排序集) 中最小的4个值
zrank | zrevrank
zrank zset1 n2: 返回zset1中n1的索引
zrevrank zset1 n2: 返回zset1中n1的倒序索引
应用场景
排行榜:由于zset带有score属性,所以很适合用于排行榜
8.十大类型之 Bitmap
setbit | getbit
**setbit k1 0 1 **: 给位图k1中下标为0处的值设为1
getbit k1 0 : 获取位图k1中下标为0处的值
strlen
strlen k1 : 获取k1的长度,这里的长度以byte为单位,k1中如果只有8个bit,则返回1.
每超过一个byte就扩容一个byte,比如9个bit就返回2
bitcount
**bitcount k1 **:统计k1中 1 的数量
bitop
参考:BITOP — Redis 命令参考 (redisfans.com)
应用场景
保存状态信息:如每天的签到情况、登录情况、活跃度等
9.十大类型之 HyperLogLog
pfadd
pfadd hpll1 1 2 3 4 5 6 : 向hpll1输入元素1 2 3 4 5 5 5,但元素不会进行存储,只会去重统计基数
pfcount
pfcount hpll1 :返回hpll1统计得到的基数
pfmerge
pfmerge hpll3 hpll1 hpll2 : 合并hpll1和hpll2,得到hpll3
应用场景
统计访问量、浏览量
10.十大类型之 GEO
由于GEO是属于zset的一种,所以zset的方法也适用于GEO
GEO用于存储某个地址的经纬度,关于经纬度坐标可以在网上获取到:拾取坐标系统 (baidu.com)
geoadd
geoadd myaddress 116.363909 23.267944 小刀电动车 116.363675 23.268031 天能电池:向myaddress中插入两个地址,类似于zset,不过原来的score换成了坐标
geopos
geopos myaddress 小刀电动车 :获取“小刀电动车”的坐标
geohash
geohash myaddress 小刀电动车:获取“小刀电动车”的坐标映射
geodist
geodist myaddress 小刀电动车 天能电池 m : 获取这两地之间的距离,以米为单位,可选[ m | km | ft | mi ],分别代表米、千米、英尺、英里,不选则默认为m
georadius
georadius myaddress 116.xxx 23.xxx 100 m withdist withhash withcoord count 10 desc : 查询myaddress中,在以116.xxx 23.xxx为中心,距离100米内的地址,返回地址名、距离、地址哈希码、地址坐标,按降序排列,上限为10
georadiusbymember
georadiusbymember myaddresss location1 100 m withdist withhash withcoord count 10 desc:与上一条命令相同,但是中心坐标是使用myaddress中的location1
应用场景
存储地址
11.十大类型之 Stream
在Stream中+和-分别代表最大和最小可能出现的id
xadd
xadd mystream * k1 v1 k2 v2 : 向mystream中插入两条消息k1和k2,值为v1和v2。id的位置上的 * 代表自动生成id。插入后返回id,id由2部分组成,“毫秒时间戳-当前消息在同毫秒内的消息序号”
xrange | xrevrange
xrange mystream - + count 10:按照时间戳由小到大的顺序,返回mystream中10条消息,count是可选参数
xrevrange mystream - + count 10 : 与上面的命令相似,但是倒序
xlen
xlen mystream : 返回mystream中的消息数量
xdel
xdle mystream 1695540348043-0 :删除id为1695540348043-0的消息
xtrim
xtrim mystream maxlen 2 : 截取mystream,只保留最近2条消息
xtrim mystream minid 1695540348043-0 : 截取mystream,只保留id大于等于1695540348043-0的消息
xread
**xread count 2 streams mystream 0-0 **: 从最小id开始,获取mystream中的2条消息,0-0也可以是0 | 00 | 000
xread count1 block 0 streams mystream $ : 永远阻塞,直到在mystream中读取到比目前最大id还大的1条消息为止