深入解析Redis中的数据结构,聊聊应用场景

本篇文章带大家深入了解一下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)

1.png

string字符串类型

Redis的String能表达3种值的类型:字符串、整数、浮点数 100.01 是个六位的串

常用命令

命令名称命令格式命令描述
setset key value赋值
getget key取值
getsetgetset key value取值并赋值
msetMSET key1 value1 key2 value2 .. keyN valueN设置多个 key 的值为各自对应的 value。
mgetMGET KEY1 KEY2 .. KEYN返回所有(一个或多个)给定 key 的值
EXPIREEXPIRE key seconds设置一个键的过期时间(秒)
appendappend key value向尾部追加值
strlenstrlen key获取字符串长度
setnxsetnx key value当value不存在时采用赋值
set key value NX PX 3000 原子操作,px 设置毫秒数
incrincr key递增数字
incrbyincrby key increment增加指定的整数
decrdecr key递减数字
decrbydecrby 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亿)

常用命令

命令名称命令格式命令描述
lpushlpush key v1 v2 v3 ...从左侧插入列表
lpoplpop key从列表左侧取出
rpushrpush key v1 v2 v3 ...从右侧插入列表
rpoprpop key从列表右侧取出
lpushxlpushx key value将值插入到列表头部
blpopblpop key timeout从列表左侧取出,当列表为空时阻塞,可以设置最大阻塞时间,单位为秒
llenllen key获得列表中元素个数
lrangelrange key start end返回列表中指定区间的元素,区间通过start和end指定
lsetlset key index value将列表index位置的元素设置成value的值
rpoplpushrpoplpush key1 key2从key1列表右侧弹出并插入到key2列表左侧
rpushxrpushx key将值插入到列表尾部 value
brpopblpop key从列表右侧取出,当列表为空时阻塞,可以设置最大阻塞时 timeout 间,单位为秒
lindexlindex key value获得列表中下标为index的元素 index从0开始 index
ltrimltrim key start end对列表进行修剪,只保留start到end区间 end
brpoplpushbrpoplpush从key1列表右侧弹出并插入到key2列表左侧,会阻塞 key1 key2
linsertlinsert 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

常用命令

命令名称命令格式命令描述
saddsadd key value1 value2 ....往集合key中存入元素,元素存在则忽略,若key不存在则新建
sremsrem key value1 value2 ....从集合key中删除元素
smemberssmembers key获得集合中所有元素
spopspop key count从集合key中选出count个元素,元素从key中删除
srandmembersrandmember key count从集合key中选出count个元素,元素不从key中删除
scardscard key获取集合key的元素个数
sismembersismember key member判断member元素是否存在于集合key中
sintersinter key1 key2 key3求多集合的交集
sdiffsdiff key1 key2 key3求多集合的差集
sunionsunion key1 key2 key3求多集合的并集

应用场景

  • 微信抽奖小程序

  • 微博点赞、收藏、标签

  • 微博微信关注模型

  • 电商商品筛选

zset有序集合类型

SortedSet(ZSet) 有序集合: 元素本身是无序不重复的 每个元素关联一个分数(score) 可按分数排序,分数可重复

常用命令

命令名称命令格式命令描述
zaddzadd key score1 member1 score2 member2 ...往有序集合key中加入带分值元素
zremzrem key mem1 mem2 ....从有序集合key中删除元素
zcardzcard key获得有序集合中的元素数量
zcountzcount key min max返回集合中score值在[min,max]区间 的元素数量
zincrbyzincrby key increment member为有序集合key中元素member的分值加上increment
zscorezscore key member返回有序集合key中元素member的分值
zrankzrank key member获得集合中member的排名(按分值从 小到大)
zrangezrange key start end正 序获取有序集合key从start下标到stop下标的元素
zrevrankzrevrank key member获得集合中member的排名(按分值从 大到小)
zrevrange zrevrange key start end倒序获取有序集合key从start下标到stop下标的元素

应用场景

  • 点击排行榜、销量排行榜、关注排行榜

hash类型

Redis hash是一个string类型的field和value的映射表,它提供了字段和字段值的映射。每个 hash 可以存储 2^32-1键值对(40多亿)。

2.png

  • 优点

    • 1、同类数据归类整合储存,方便数据管理

    • 2、相比string操作消耗内存与cpu更小

    • 3、相比string储存更节省空间

  • 缺点

    • 1、过期功能不能使用在field上,只能用在key上

    • 2、Redis集群架构下不适合大规模使用

常用命令

命令名称命令格式命令描述
hsethset key field value存储一个哈希表key的键值
hmsethmset key field1 value1 field2 value2在一个哈希表key中存储多个键值对
hgethget key field查看某个field是否存在
hmgethmget key field1 field2 ...获取一个字段值
hsetnxhsetnx key field value存储一个不存在的哈希表key的键值
hexistshexists key filed判断filed是否存在
hgetallhgetall key获取多个字段值
hdelhdel key field1 field2...删除指定字段
hincrbyhincrby key field increment指定字段自增increment
hlenhlen key获得字段数量

应用场景

  • 对象缓存

  • 购物车操作

bitmap位图类型

bitmap是进行位操作的 通过一个bit位来表示某个元素对应的值或者状态,其中的key就是对应元素本身。 bitmap本身会极大的节省储存空间。

常用命令

命令名称命令格式命令描述
setbitsetbit key offset value设置key在offset处的bit值(只能是0或者 1)。
getbitgetbit key offset获得key在offset处的bit值
bitcountbitcount key获得key的bit位为1的个数
bitposbitpos key value返回第一个被设置为bit值的索引值
bitopbitop 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算法

常用命令

命令名称命令格式命令描述



geoaddgeoadd key 经度 纬度 成员名称1 经度1 纬度1 成 员名称2 经度2 纬度 2 ...添加地理坐标
geoposgeopos key 成员名称1 成员名称2...返回成员经纬度
geodistgeodist key 成员1 成员2 单位计算成员间距离
georadiusbymembergeoradiusbymember key 成员 值单位 count 数 asc[desc]根据成员查找附近的成员
geohashgeohash key 成员名称1 成员名称2...返回标准的 geohash串

应用场景

1、记录地理位置

2、计算距离

3、查找"附近的人"

stream数据流类型

stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。

几乎满足了消息队列具备的全部内容,包括:

  • 消息ID的序列化生成
  • 消息遍历
  • 消息的阻塞和非阻塞读取
  • 消息的分组消费
  • 未完成消息的处理
  • 消息队列监控

每个Stream都有唯一的名称,它就是Redis的key,首次使用 xadd 指令追加消息时自动创建

应用场景

消息队列的使用

更多编程相关知识,请访问:编程入门!!

以上就是深入解析Redis中的数据结构,聊聊应用场景的详细内容,更多请关注其它相关文章!