一文搞定Redis五大数据类型及使用场景


一文搞定Redis五大数据类型及使用场景文章插图
作者 | 周明尧
来源 | Java旅途(ID:Javatrip)
头图 | CSDN 下载自东方IC
Redis 是一种基于键值对的NoSQL数据库 , 它的值主要由string(字符串) , hash(哈希) , list(列表) , set(集合) , zset(有序集合)五种基本数据结构构成 , 除此之外还支持一些其他的数据结构和算法 。 key都是由字符串构成的 , 那么这五种数据结构的使用场景有哪些?一起来看看!
一文搞定Redis五大数据类型及使用场景文章插图
字符串字符串类型是Redis最基础的数据结构 , 字符串类型可以是JSON、XML甚至是二进制的图片等数据 , 但是最大值不能超过512MB 。
1.1 内部编码Redis会根据当前值的类型和长度决定使用哪种内部编码来实现 。
字符串类型的内部编码有3种:

  • int:8个字节的长整型 。
  • embstr:小于等于39个字节的字符串 。
  • raw:大于39个字节的字符串 。
1.2 使用场景1.2.1 缓存在web服务中 , 使用MySQL作为数据库 , Redis作为缓存 。 由于Redis具有支撑高并发的特性 , 通常能起到加速读写和降低后端压力的作用 。 web端的大多数请求都是从Redis中获取的数据 , 如果Redis中没有需要的数据 , 则会从MySQL中去获取 , 并将获取到的数据写入redis 。
1.2.2 计数Redis中有一个字符串相关的命令incr key , incr命令对值做自增操作 , 返回结果分为以下三种情况:
  • 值不是整数 , 返回错误
  • 值是整数 , 返回自增后的结果
  • key不存在 , 默认键为0 , 返回1
比如文章的阅读量 , 视频的播放量等等都会使用redis来计数 , 每播放一次 , 对应的播放量就会加1 , 同时将这些数据异步存储到数据库中达到持久化的目的 。
1.2.3 共享Session在分布式系统中 , 用户的每次请求会访问到不同的服务器 , 这就会导致session不同步的问题 , 假如一个用来获取用户信息的请求落在A服务器上 , 获取到用户信息后存入session 。 下一个请求落在B服务器上 , 想要从session中获取用户信息就不能正常获取了 , 因为用户信息的session在服务器A上 , 为了解决这个问题 , 使用redis集中管理这些session , 将session存入redis , 使用的时候直接从redis中获取就可以了 。
1.2.4 限速为了安全考虑 , 有些网站会对IP进行限制 , 限制同一IP在一定时间内访问次数不能超过n次 。
一文搞定Redis五大数据类型及使用场景文章插图
哈希
Redis中 , 哈希类型是指一个键值对的存储结构 。
2.1 内部编码哈希类型的内部编码有两种:
  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)同时所有值都小于hash-max-ziplist-value配置(默认64字节)时使用 。 ziplist使用更加紧凑的结构实现多个元素的连续存储 , 所以比hashtable更加节省内存 。
  • hashtable(哈希表):当ziplist不能满足要求时 , 会使用hashtable 。
2.2 使用场景由于hash类型存储的是一个键值对 , 比如数据库有以下一个用户表结构
idnameage1Java旅途18将以上信息存入redis , 用表明:id作为key , 用户属性作为值:
hset user:1 name Java旅途 age 18使用哈希存储会比字符串更加方便直观
一文搞定Redis五大数据类型及使用场景文章插图
列表列表类型用来存储多个有序的字符串 , 一个列表最多可以存储2^32-1个元素 , 列表的两端都可以插入和弹出元素 。
3.1 内部编码列表的内部编码有两种:
  • ziplist(压缩列表):当哈希类型元素个数小于list-max-ziplist-entries配置(默认512个)同时所有值都小于list-max-ziplist-value配置(默认64字节)时使用 。 ziplist使用更加紧凑的结构实现多个元素的连续存储 , 所以比hashtable更加节省内存 。
  • linkedlist(链表):当ziplist不能满足要求时 , 会使用linkedlist 。
3.2 使用场景3.2.1 消息队列列表用来存储多个有序的字符串 , 既然是有序的 , 那么就满足消息队列的特点 。 使用lpush+rpop或者rpush+lpop实现消息队列 。 除此之外 , redis支持阻塞操作 , 在弹出元素的时候使用阻塞命令来实现阻塞队列 。
3.2.2 栈由于列表存储的是有序字符串 , 满足队列的特点 , 也就能满足栈先进后出的特点 , 使用lpush+lpop或者rpush+rpop实现栈 。
3.2.3 文章列表因为列表的元素不但是有序的 , 而且还支持按照索引范围获取元素 。 因此我们可以使用命令lrange key 0 9分页获取文章列表