深入解析Redis中的数据结构,聊聊应用场景
本篇文章带大家深入了解一下Redis中的数据结构,看看这些数据结构的应用场景,希望对大家有所帮助!
Redis数据类型和应用场景
Redis是一个Key-Value的存储系统,使用ANSI C语言编写。 key的类型是字符串。【相关推荐:Redis视频教程】
value的数据类型8种数据类型:
常见数据类型
string字符串类型
list列表类型
set集合类型
sortedset(zset)有序集合类型
hash类型
不常见数据类型
bitmap位图类型
geo地理位置类型
stream类型
注意
Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)
string字符串类型
Redis的String能表达3种值的类型:字符串、整数、浮点数 100.01 是个六位的串
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
set | set key value | 赋值 |
get | get key | 取值 |
getset | getset key value | 取值并赋值 |
mset | MSET key1 value1 key2 value2 .. keyN valueN | 设置多个 key 的值为各自对应的 value。 |
mget | MGET KEY1 KEY2 .. KEYN | 返回所有(一个或多个)给定 key 的值 |
EXPIRE | EXPIRE key seconds | 设置一个键的过期时间(秒) |
append | append key value | 向尾部追加值 |
strlen | strlen key | 获取字符串长度 |
setnx | setnx key value | 当value不存在时采用赋值 set key value NX PX 3000 原子操作,px 设置毫秒数 |
incr | incr key | 递增数字 |
incrby | incrby key increment | 增加指定的整数 |
decr | decr key | 递减数字 |
decrby | decrby key decrement | 减少指定的整数 |
应用场景
1、对象缓存
2、单值缓存
3、incr用于乐观锁 incr:递增数字,可用于实现乐观锁 watch(事务)
4、setnx用于分布式锁 当value不存在时采用赋值,可用于实现分布式锁
5、计数器
6、Web集群session共享
常用方法举例
dockerRedis:0>keys * dockerRedis:0>append testName 2 "1" dockerRedis:0>exists testName "1" dockerRedis:0>append testName " 1234" "6" dockerRedis:0>get testName "2 1234" dockerRedis:0>set testName1 "testName1" "OK" dockerRedis:0>get testName1 "testName1" dockerRedis:0>getset testName2 "testName2" null dockerRedis:0>get testName2 "testName2" dockerRedis:0>strlen testName "6" dockerRedis:0>set incrTest "10" "OK" dockerRedis:0>incr incrTest "11" dockerRedis:0>get incrTest "11" dockerRedis:0>decr incrTest "10" dockerRedis:0>decrby incrTest 5 "5" dockerRedis:0>mset set01 1 set02 2 set03 3 "OK" dockerRedis:0>mget set01 set02 set03 1) "1" 2) "2" 3) "3"
list列表类型
list列表类型可以存储有序、可重复的元素获取头部或尾部附近的记录是极快的 list的元素个数最多为2^32-1个(40亿)
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
lpush | lpush key v1 v2 v3 ... | 从左侧插入列表 |
lpop | lpop key | 从列表左侧取出 |
rpush | rpush key v1 v2 v3 ... | 从右侧插入列表 |
rpop | rpop key | 从列表右侧取出 |
lpushx | lpushx key value | 将值插入到列表头部 |
blpop | blpop key timeout | 从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时间,单位为秒 |
llen | llen key | 获得列表中元素个数 |
lrange | lrange key start end | 返回列表中指定区间的元素,区间通过start和end指定 |
lset | lset key index value | 将列表index位置的元素设置成value的值 |
rpoplpush | rpoplpush key1 key2 | 从key1列表右侧弹出并插入到key2列表左侧 |
rpushx | rpushx key | 将值插入到列表尾部 value |
brpop | blpop key | 从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时 timeout 间,单位为秒 |
lindex | lindex key value | 获得列表中下标为index的元素 index从0开始 index |
ltrim | ltrim key start end | 对列表进行修剪,只保留start到end区间 end |
brpoplpush | brpoplpush | 从key1列表右侧弹出并插入到key2列表左侧,会阻塞 key1 key2 |
linsert | linsert key BEFORE/AFTER pivot value | 将value插入到列表,且位于值pivot之前或之后 |
应用场景
1、Stack(栈)=LPUSH + LPOP
2、Queue(队列)=LPUSH + RPOP
3、Blocking MQ(阻塞队列)=LPUSH + BRPOP
4、用户列表、商品列表、评论列表
set集合类型
Set:无序、唯一元素 集合中最大的成员数为 2^32 - 1
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
sadd | sadd key value1 value2 .... | 往集合key中存入元素,元素存在则忽略,若key不存在则新建 |
srem | srem key value1 value2 .... | 从集合key中删除元素 |
smembers | smembers key | 获得集合中所有元素 |
spop | spop key count | 从集合key中选出count个元素,元素从key中删除 |
srandmember | srandmember key count | 从集合key中选出count个元素,元素不从key中删除 |
scard | scard key | 获取集合key的元素个数 |
sismember | sismember key member | 判断member元素是否存在于集合key中 |
sinter | sinter key1 key2 key3 | 求多集合的交集 |
sdiff | sdiff key1 key2 key3 | 求多集合的差集 |
sunion | sunion key1 key2 key3 | 求多集合的并集 |
应用场景
微信抽奖小程序
微博点赞、收藏、标签
微博微信关注模型
电商商品筛选
zset有序集合类型
SortedSet(ZSet) 有序集合: 元素本身是无序不重复的 每个元素关联一个分数(score) 可按分数排序,分数可重复
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
zadd | zadd key score1 member1 score2 member2 ... | 往有序集合key中加入带分值元素 |
zrem | zrem key mem1 mem2 .... | 从有序集合key中删除元素 |
zcard | zcard key | 获得有序集合中的元素数量 |
zcount | zcount key min max | 返回集合中score值在[min,max]区间 的元素数量 |
zincrby | zincrby key increment member | 为有序集合key中元素member的分值加上increment |
zscore | zscore key member | 返回有序集合key中元素member的分值 |
zrank | zrank key member | 获得集合中member的排名(按分值从 小到大) |
zrange | zrange key start end | 正 序获取有序集合key从start下标到stop下标的元素 |
zrevrank | zrevrank key member | 获得集合中member的排名(按分值从 大到小) |
zrevrange | zrevrange key start end | 倒序获取有序集合key从start下标到stop下标的元素 |
应用场景
- 点击排行榜、销量排行榜、关注排行榜
hash类型
Redis hash是一个string类型的field和value的映射表,它提供了字段和字段值的映射。每个 hash 可以存储 2^32-1键值对(40多亿)。
优点
1、同类数据归类整合储存,方便数据管理
2、相比string操作消耗内存与cpu更小
3、相比string储存更节省空间
缺点
1、过期功能不能使用在field上,只能用在key上
2、Redis集群架构下不适合大规模使用
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
hset | hset key field value | 存储一个哈希表key的键值 |
hmset | hmset key field1 value1 field2 value2 | 在一个哈希表key中存储多个键值对 |
hget | hget key field | 查看某个field是否存在 |
hmget | hmget key field1 field2 ... | 获取一个字段值 |
hsetnx | hsetnx key field value | 存储一个不存在的哈希表key的键值 |
hexists | hexists key filed | 判断filed是否存在 |
hgetall | hgetall key | 获取多个字段值 |
hdel | hdel key field1 field2... | 删除指定字段 |
hincrby | hincrby key field increment | 指定字段自增increment |
hlen | hlen key | 获得字段数量 |
应用场景
对象缓存
购物车操作
bitmap位图类型
bitmap是进行位操作的 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。 bitmap本身会极大的节省储存空间。
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
setbit | setbit key offset value | 设置key在offset处的bit值(只能是0或者 1)。 |
getbit | getbit key offset | 获得key在offset处的bit值 |
bitcount | bitcount key | 获得key的bit位为1的个数 |
bitpos | bitpos key value | 返回第一个被设置为bit值的索引值 |
bitop | bitop and[or/xor/not] destkey key [key ...] | 对多个key 进行逻辑运算后存入destkey 中 |
应用场景
- 1、用户每月签到,用户id为key , 日期作为偏移量 1表示签到
- 2、统计活跃用户, 日期为key,用户id为偏移量 1表示活跃
- 3、查询用户在线状态, 日期为key,用户id为偏移量 1表示在线
geo地理位置类型
geo是Redis用来处理位置信息的。在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和geohash算法
常用命令
命令名称 | 命令格式 | 命令描述 |
---|---|---|
geoadd | geoadd key 经度 纬度 成员名称1 经度1 纬度1 成 员名称2 经度2 纬度 2 ... | 添加地理坐标 |
geopos | geopos key 成员名称1 成员名称2... | 返回成员经纬度 |
geodist | geodist key 成员1 成员2 单位 | 计算成员间距离 |
georadiusbymember | georadiusbymember key 成员 值单位 count 数 asc[desc] | 根据成员查找附近的成员 |
geohash | geohash key 成员名称1 成员名称2... | 返回标准的 geohash串 |
应用场景
1、记录地理位置
2、计算距离
3、查找"附近的人"
stream数据流类型
stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。
几乎满足了消息队列具备的全部内容,包括:
- 消息ID的序列化生成
- 消息遍历
- 消息的阻塞和非阻塞读取
- 消息的分组消费
- 未完成消息的处理
- 消息队列监控
每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建
应用场景
消息队列的使用
更多编程相关知识,请访问:编程入门!!
以上就是深入解析Redis中的数据结构,聊聊应用场景的详细内容,更多请关注其它相关文章!