缓存神器Redis的五种数据类型及使用

redis作为Nosql的代表,想必大家已经再熟悉不过了,除了作为缓存来使用,Redis还提供了其他很多有用的功能,例如可作为消息队列、分布式锁、不隆过滤器、限流等功能使用 。今天先来说一说redis作为缓存使用,提供了5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈 希) 和 zset (有序集合) 。
 

缓存神器Redis的五种数据类型及使用

文章插图
 
一、string (字符串)
字符串 string 是 Redis 最简单的数据结构 。Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一key值来获取相应的 value 数据 。不同类型的数据结构的差异就在于value 的结构不一样 。字符串结构使用非常广泛,一个常见的用途就是缓存用户信息 。我们将用户信息结构体 使用 JSON 序列化成字符串,然后将序列化后的字符串塞进 Redis 来缓存 。同样,取用户 信息会经过一次反序列化的过程 。Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 JAVA 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,字符串最大长度为 512M 。使用命令如下:
设置键值对:set [key] [value]
获取对应键的值:get [key]
批量操作键值对:mset [key] [value] [key] [value] [key] [value] ...
批量获取对应键的值:mget [key] [key] [key]...
批量操作可以节省网络耗时开销 。
缓存神器Redis的五种数据类型及使用

文章插图
 
可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间 。在保证缓存是热点数据或者保证缓存和数据库一致性的解决方案时,设置失效时间是必不可少的 。还有就是整数的自增或者自减功能,如果 value 值是一个整数,可以对它进行自增操作 。自增是有范围的,它的范围是signed long 的最大最小值,超过了这个值,Redis 会报错 。
设置过期可以用set+expire的组合,但是保证不了原子性,如果想保证原子性,就用setex命令:
 
缓存神器Redis的五种数据类型及使用

文章插图
 
关于自增和自减:
incr/decr:自增/自减 1
incrby/decrby [key] [num]:自增/自减 num
 
缓存神器Redis的五种数据类型及使用

文章插图
 
二、list (列表)
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组 。链表由于有前后节点,特点是插入和删除快,查询慢;数组由于有索引,所以特点是查询快,但是插入和删除慢;这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n) 。当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收 。Redis 的列表结构常用来做异步队列使用 。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理 。
操作命令:
Lpush——先进后出,在列表头部插入元素Rpush——先进先出,在列表的尾部插入元素Lrange——出栈,根据索引,获取列表元素Lpop——左边出栈,获取列表的第一个元素Rpop——右边出栈,获取列表的最后一个元素Lindex——根据索引,取出元素Llen——链表长度,元素个数Lrem——根据key,删除n个valueLtrim——根据索引,删除指定元素Lset——根据index,设置valueLinsert before——根据value,在之前插入值Linsert after——根据value,在之后插入值BLPOP/BRPOP key -- 移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止BRPOPLPUSH source destination timeout -- 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 。LPUSHX -- 将一个值插入到已存在的列表头部 
缓存神器Redis的五种数据类型及使用

文章插图
 
命令lindex 相当于 Java 链表的 get(int index)方法,它需要对链表进行遍历,性能随着参数 index 增大而变差 。如果再深入一点,你会发现 Redis 底层存储的还不是一个简单的linkedlist,而是称之为快速链表 quicklist 的一个结构 。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是 ziplist,也即是压缩列表 。它将所有的元素紧挨着一起存储,分配的是一块连续的内存 。当数据量比较多的时候才会改成 quicklist 。因为普通的链表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化 。快速列表既满足了快速的插入删除性能,又不会出现太大的空间冗余 。


推荐阅读