redis深度历险学习笔记--基础与应用篇(一)

redis应用场景

缓存和分布式锁等等

举例:

  1. 记录帖子点赞数,评论数和点击数(hash)
  2. 记录用户的帖子ID列表(排序),便于快速显示用户的帖子列表(zset)
  3. 记录帖子的标题,摘要,作者和封面信息,用于列表页展示(hash)
  4. 记录帖子的相关文章ID,根据内容推荐相关帖子(list)
  5. 如果帖子的ID是整数自增的,可以使用Redis来分配帖子ID(计数器)
  6. 等等

redis安装

有docker方式,Github源码编译方式,直接安装方式

这里推荐docker安装方式,docker-compose搭建redis服务

redis的五种基础数据结构

  1. string(字符串)
  2. list(列表)
  3. hash(字典)
  4. set(集合)
  5. zset(有序集合)

redis基本类型操作API

string
内部表示就是一个字符数组。redis的字符串是动态字符串,是可以修改的字符串。采用预分配冗余内存的方式来减少内存的频繁分配。
当字符串长度小于1MB时,扩容都是加倍现有的空间。如果字符串长度超过1MB,扩容时一次就只会多扩1MB的空间。需要注意的是字符串的最大长度为512MB。
list
开始可以认为内部实现是一个双向的链表
redis的列表结构常用来做异步队列。将需要延后处理的任务结构体序列化成字符串,塞进Redis的列表,另一个线程从这个列表中轮询数据进行处理
如果再深入一点,你会发现Redis底层存储的不是一个简单的linkedlist,而是称为“快速链表(quicklist)的一个结构”
首先在列表元素较少的情况下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。它将所有的元素彼此紧挨着一起存储,分配的是一块连续的内存。当数据量比较大的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化,比如某普通链表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。所以redis将链表和ziplist结合起来组成了quicklist,也就是将多个ziplist使用双向指针串起来使用。quicklist即满足了快速的插入删除性能,又不会出现太大的空间冗余。后面进阶部分会再讲到
hash
无序字典,由“数组+链表”组成,可参考实现简易哈希表
跟语言里的hash不同的是,redis中的字典的key只能是字符串
当hash结构移除了最后一个元素后,该数据结构被自动删除,内存被回收
set
有自去重功能
当集合中移除了最后一个元素后,该数据结构被自动删除,内存被回收
zset
zset是redis提供的最有特色的数据结构,一方面它是一个set,保证了内部value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。它的内部实现用的是一个叫做“跳跃列表”的数据结构。
当zset中移除了最后一个元素后,该数据结构被自动删除,内存被回收

容器型数据结构的通用规则

list,set,hash,zset这四种数据结构是容器型数据结构,它们共享下面的两条通用规则:

  1. create if not exists
  2. drop if no elements:容器中没有元素了,那么就会立即删除容器,释放内存

过期时间

redis的树有数据结构都可以设置过期时间,时间到了,Redis会自动删除相应对象。需要注意的是,过期时间是以对象为单位的,比如一个hash结构的过期是整个hash对象的过期,而不是其中的某个子Key的过期

如果一个字符串已经设置了过期时间,然后你调用set方法修改了它,它的过期时间会消失

猜你喜欢

转载自blog.csdn.net/csdniter/article/details/112593528