Redis使用及数据结构

  1. redis的五种基础数据结构,string,list,set,hash,zset。详情参见redis
  2. 字符串(动态,类似于Java的Array List,扩容加倍)结构应用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用JSON序列化成字符串,然后将序列化的字符串塞进redis来缓存。那么取出用户信息就需要反序列化。
  3. Redis的列表结构(list)常用作异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进redis的列表,另一个线程从这个列表中轮询数据进行处理
  4. Redis底层存储的list是快速列表(quick List),而不是简单linklist。在数据少时用压缩链表ziplist(连续的存储空间)(如其名,它还会被使用LZF算法压缩,以节约空间,默认不压缩(压缩深度0)),数据比较多时改成quicklist。Quicklist实质上就是将多个ziplist使用双向指针连起来。这样既不会造成传统链表的浪费空间以及内存碎片化的问题,也保证了插入删除的性能
  5. Redis的hash(字典)相当与Java的HashMap,他是无序字典。内部结构采用和Java的Hash Map一样的数组加链表的二维结构(数组中存储的是链表中的第一个元素的指针)。Hashtable性能好不好取决于采用的hash函数,redis采用的hash函数是siphash
  6. rehash
    当哈希表的大小不能满足需求,就可能会有两个或者以上数量的键被分配到了哈希表数组上的同一个索引上,于是就发生冲突(collision),在Redis中解决冲突的办法是链接法(separate chaining)。但是需要尽可能避免冲突,希望哈希表的负载因子(load factor),维持在一个合理的范围之内,就需要对哈希表进行扩展或收缩。Redis对哈希表的rehash操作步骤如下:

    扩展或收缩
    扩展:ht[1]的大小为第一个大于等于ht[0].used * 2的 2n2n 。
    收缩:ht[1]的大小为第一个大于等于ht[0].used的 2n2n 。
    将所有的ht[0]上的节点rehash到ht[1]上。
    释放ht[0],将ht[1]设置为第0号表,并创建新的ht[1]。
  7. Redis采用的是渐进式rehash(提高性能,不堵塞服务),即有新旧两个hash结构,一边删一边复制
  8. Hash也可以用来存储用户信息,不同于字符串一次性需要序列化整个对象,hash可以对用户结构中的每个字段单独存储,读取时也部分读取,省内存。但是同时hash结构的存储消耗大于单个字符串
  9. Redis的set集合相当于Java的hashset
  10. Redis的zset(有序列表)类似于SortsedSet和hashMap的结合体(在set的基础上加了一个score)。内部实现是跳跃链表(skiplist)
  11. 跳跃链表------内部为了实现排序和插入删除,采用了层级制,相当于很多曾的“二分查找”,但是实质上并不是“二分”,而是随机分。
  12. 容器型数据结构(list,set,hash,zset)采用自动删除,自动创建
  13. Redis的所有数据结构都可以设置过期时间,但只能给整个对象设置过期时间,不能给某一个key。而且如果一个被设置了过期时间的数据结构又被set修改了,那么这个过期时间就会消失
  14. Hyperloglog提供不精确的去重方案,标准误差(0.81),用以统计uv(访问网站的自然人数)。(pv是点击量)
  15. 位图就是普通的字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值