热门关键字:
jquery > jquery教程 > jquery教程 > 通俗易懂的Redis数据结构基础教程

通俗易懂的Redis数据结构基础教程

298
作者:管理员
发布时间:2021/3/8 11:36:38
评论数:0
转载请自觉注明原文:http://www.jq-school.com/Show.aspx?id=4125
  Redis有5个基本数据结构,string、list、hash、set和zset。它们是日常开发中使用频率非常高应用最为广泛的数据结构,把这5个数据结构都吃透了,你就掌握了Redis应用知识的一半了。


  string


  首先我们从string谈起。string表示的是一个可变的字节数组,我们初始化字符串的内容、可以拿到字符串的长度,可以获取string的字串,可以覆盖string的字串内容,可以追加子串。


  Redis的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。


  初始化字符串 需要提供「变量名称」和「变量的内容」


  > set ireader beijing.zhangyue.keji.gufen.youxian.gongsi


  OK


  复制代码


  获取字符串的内容 提供「变量名称」


  > get ireader


  "beijing.zhangyue.keji.gufen.youxian.gongsi"


  复制代码


  获取字符串的长度 提供「变量名称」


  > strlen ireader


  (integer) 42


  复制代码


  获取子串 提供「变量名称」以及开始和结束位置[start, end]


  > getrange ireader 28 34


  "youxian"


  复制代码


  覆盖子串 提供「变量名称」以及开始位置和目标子串


  > setrange ireader 28 wooxian


  (integer) 42  # 返回长度


  > get ireader


  "beijing.zhangyue.keji.gufen.wooxian.gongsi"


  复制代码


  追加子串


  > append ireader .hao


  (integer) 46 # 返回长度


  > get ireader


  "beijing.zhangyue.keji.gufen.wooxian.gongsi.hao"


  复制代码


  遗憾的是字符串没有提供字串插入方法和子串删除方法。


  计数器 如果字符串的内容是一个整数,那么还可以将字符串当成计数器来使用。


  > set ireader 42


  OK


  > get ireader


  "42"


  > incrby ireader 100


  (integer) 142


  > get ireader


  "142"


  > decrby ireader 100


  (integer) 42


  > get ireader


  "42"


  > incr ireader  # 等价于incrby ireader 1


  (integer) 143


  > decr ireader  # 等价于decrby ireader 1


  (integer) 142


  复制代码


  计数器是有范围的,它不能超过Long.Max,不能低于Long.MIN


  > set ireader 9223372036854775807


  OK


  > incr ireader


  (error) ERR increment or decrement would overflow


  > set ireader -9223372036854775808


  OK


  > decr ireader


  (error) ERR increment or decrement would overflow


  复制代码


  过期和删除 字符串可以使用del指令进行主动删除,可以使用expire指令设置过期时间,到点会自动删除,这属于被动删除。可以使用ttl指令获取字符串的寿命。


  > expire ireader 60


  (integer) 1  # 1表示设置成功,0表示变量ireader不存在


  > ttl ireader


  (integer) 50  # 还有50秒的寿命,返回-2表示变量不存在,-1表示没有设置过期时间


  > del ireader


  (integer) 1  # 删除成功返回1


  > get ireader


  (nil)  # 变量ireader没有了


  复制代码


  list


  Redis将列表数据结构命名为list而不是array,是因为列表的存储结构用的是链表而不是数组,而且链表还是双向链表。因为它是链表,所以随机定位性能较弱,首尾插入删除性能较优。如果list的列表长度很长,使用时我们一定要关注链表相关操作的时间复杂度。


  负下标 链表元素的位置使用自然数0,1,2,…n-1表示,还可以使用负数-1,-2,…-n来表示,-1表示「倒数第一」,-2表示「倒数第二」,那么-n就表示第一个元素,对应的下标为0。




如果您觉得本文的内容对您的学习有所帮助:支付鼓励



关键字:jquery
友荐云推荐