一共有8中数据类型,常用的是5种
String
String字符串
Int整数
Float字符串
常用操作命令
set young 2673 [EX 过期时间(秒)| PX 过期时间 毫秒] [NX key 不存在操作才能成功| XX 只有Key存在的时候才能成功]
mset young 2673 hui 666
批量set
mget young hui
批量get
strlen young
value长度
append young good
给value后面追加
getrange young 0 8
返回value的指定范围的值,-1为所有
ncr young
对value进行递增1
incrby young 100
指定递增步幅
decr young
递减
decrby young 100
指定步幅递减
set f 2.6
设置浮点数
incrbyfloat f 7.3
对浮点数进行递增
位操作
一个字符是按8位二进制存储的
setbit k1 6 1
修改value指定位上的值
getbit k1 0
获取指定位上的值
bitcount k1
查看key里有多少个count
bitpos k1 1
获取第一个1的下标
BITOP AND destkey srckey1 ... srckeyN,对一个或多个key求逻辑与,并将结果保存到destkey
BITOP OR destkey srckey1 ... srckeyN,对个或多个key求逻辑或,并将结果保存到destkey
BITOP XOR destkey srckey1 ... srckeyN,对个或多个key求逻辑异或,并将结果保存到destkey
BITOP NOTdestkey srckey1 ... srckeyN,对个或多个key求逻辑非,并将结果保存到destkey
应用场景
-
缓存
-
分布式session
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
-
set NX EX 分布式锁
-
incr 全局ID
-
incr 计数器
-
incr 限流
-
位操作 统计
Hash
redis中,key可以分层,key:
一个冒号就是一层
set food:fruit:apple 1
set foot:fruit:banana 2
set food:meet:pork 3
set foot:meet:beaf 4
在hash中,一个key对应多个 field和value的键值对
value只能是字符串,不能是hash的嵌套
String与Hash的区别
-
使用String会创建很多的key,使用Hash就会减少空间
-
可以减少key冲突
-
减少资源消耗
-
String可以单独设置过期时间,Hash只能针对key设置过期时间,不能针对field设置过期时间
-
String可以做bit操作,Hash没有位操作
-
单个Hash的数据量很大的时候,Hash不会分散存储,会造成节点存储压力过大
Hash操作命令
hset h1 f 6
给key为h1的hash表中的f字段赋值
hmset h1 a 1 b 2 c 3 d 4
批量赋值
hget h1 a
获取key下制定field的值
hmget h1 a b c d
批量get
hkeys h1
hvals h1
hgetall h1
hget exists h1 a
判断是否存在,存在则返回1
hdel h1
hlen h1
元素个数
hincrby h2 a 10
对指定的field递增,需要递减时传负数即可
hincrbyfloat h2 b 7.3
对指定的field递增浮点数
应用场景
存储hash表
如购物车
key:用户id
field:商品id
value:商品数量
+1:hincrby id 1
-1:hdecrby id -1
删除:hdel
全选:hgetall
商品数:hlen
List
有序,左边是列表头,右边是列表尾,顺序是从左到右
元素可以重复
一个列表可以容纳2^32-1个元素
常用命令
lpush queue c
从队头插入
lpush queue d e
rpush queue f g
从队尾插入
lpop queue
从队头弹出一个元素
rpop queue
从队尾弹出一个元素
lindex queue 0
从左边获取第一个元素
lrange queue 0 -1
从左边范围获取列表的元素
blpop
阻塞弹出
lrem key count value
将列表中前count(数字)次出现的值为value(元素)删除
应用场景
消息队列
rpush
lpop
队尾入队,队头出队,先进先出
blpop
从队头弹出元素,如果没有元素,会阻塞等待,直到队列里面有元素
brpop
blpop key1 timeout
从列表key1的队头弹出元素,如果没有就进行阻塞,阻塞timeout时间
Set
无序集合,元素不能重复,可以容纳2^32-1个元素
常用命令
sadd myset a b c d e f g
插入元素到set中
smembers myset
展示所有元素
scard myset
统计元素数量
srandmember key
随机返回一个元素
spop myset
随机返回并删除
srandmember myset 2
随机返指定个数元素
srem myset d e f
移除指定元素
sismember myset a
判断元素是否在set中
集合之间的操作
获取差集(只在第一个集合,不在第二个集合)要注意顺序
sdiff set1 set2
获取交集(在两个集合中都存在)
sinter set1 set2
获取并集(合并后去重)
sunion set1 set2
应用场景
抽奖
spop 随机返回并移除
点赞、签到、打卡
用like:t1001来维护t1001这条微博的所有点赞用户
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001
商品标签
用tags:i5001来维护商品所有的标签
sadd tags:i5001 画面清晰
sadd tags:i5001 色彩好
sadd tags:i5001 流畅
商品筛选
sadd brand:apple iPhone
sadd brand:ios iPhone
sadd screensize:6.0-6.24 iPhone
sadd screentype:lcd iPhone
筛选商品,苹果的,ios的,屏幕在6.0-6.24之间的,屏幕材质是lcd屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd
用户关注模型
互相关注
sismember bob:follow me
sismember me:follow bob
共同关注
sinter me:follow bob:follow
我关注的人也关注了他?
leo是不是我关注的人里面关注的用户?
sismember :follow leo
可能认识的人
sdiffstore mayknow me:follow joy:follow
取出差集,存到新的集合中
ZSet
有序集合,每个元素有个分值,分值相同则按照key的ASCII码来排序,分值越小或者ASCII码越小,就会排在越前面
常用命令
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
添加元素,元素的分值写在元素的前面
zrange myzset 0 -1 withscores
按照下标获取元素,withscores 会显示分值
zrevrange myzset 0 -1 withscores
zrange的反转
带rev的命令都是反转操作
zrangebyscore myzset 20 30 withscores
按照分值的范围进行查找
zrem myzset php cpp
移除指定元素
zcard myzset
统计元素个数
zincrby myzset 5 python
给python元素的分值增加5分
zrank myzset python
获取元素的下标
zscore myzset java
获取元素的分值
zcount myzset 20 60
统计指定分值区间内的元素个数
应用场景
排行榜
id为6001的新闻点击数加一
zincrby hotNews:20211122 1 n6001
获取今天点击最多的15条
zrevrang hostNews:20211122 0 15 withscores
Geo、HyperLogLogs
Geo Spatial
用来保存地理位置信息的数据类型,也就是经纬度信息
常用命令
geoadd citys 121.48 31.22 sh 113.01 28.19 cs
存储经纬度信息
geopos citys cs
获取指定城市经纬度
geodist citys sh cs km
计算两个元素之间的距离,最后的属性是单位
georadius citys 113.01 28.19 5 km
距离指定经纬度5km以内的元素
geoadd citys 112.95 28.18 yl
georadiusbymember citys cs 20 km
距离指定元素不超过20km的元素
HyperLogLogs
提供一种基于基数的统计方法
可以用很少的内存计算很大的基数
会存在一定的误差
pfadd log 1 2 3 4 5 6 7 8
添加元素
pfcount log
统计元素
pfadd qs a b c d e f g
pfcount qs
pfmerge result log qs
合并两个hyperloglog