Redis小结

一、redis数据类型

redis底层的数据结构包括简单动态字符串,双端链表,字典,压缩列表,整数集合等等。但是redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包括:

  • 字符串对象(REDIS_STRING)
    • 最常用,普通的key/value存储都可以归为此类,一个键最大能存储512MB。
    • value 不仅可以是String,也可以是数字,或者序列化对象。
    • String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
  • 列表对象(REDIS_LIST)
    • list的底层实现为一个双向链表,即可以支持反向查找和遍历,更方便操作;
    • 常用于比如微博的timeline、消息队列等场景;
  • 哈希对象(REDIS_HASH)
    • Hash是一个健值对集合,是一个String类型的key与value的映射表,特别适合用于存储对象。
    • 当哈希对象保存的所有键值对键和值的字符串长度小于64字节,或者键值对数量小于512时,Redis会采用压缩列表的方式来紧凑存储,对应的value redisObject的encoding为ziplist,当成员数量增大时会自动转成真正的HashMap,此时encoding为hashtable;
    • 有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为json格式做为value进行保存。
  • 集合对象(REDIS_SET)
    • set 底层实现是一个 value永远为null的HashMap,通过计算hash的方式来快速排重,这也是set能提供判断一个成员是否在集合内的原因;
    • 常用于微博或者qq求共同好友(求交集);
  • 有序集合对象(REDIS_ZSET)
    • 类似Redis集合,不同的是增加了一个功能,即集合是有序的。一个有序集合的每个成员带有分数,用于进行排序;
    • 内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序;
    • 常用于带有权重的元素,比如一个游戏的用户得分排行榜 。

二、使用Redis的好处

  • 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

  • 支持丰富数据类型,支持string,list,set,sorted set,hash

  • 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

  • 丰富的特性:可用于缓存,消息,按key设置timeout,过期后将会自动删除。

  • 相比于memcached:
    • memcached所有的值都是简单的字符串,redis作为其代替者,支持更丰富的数据类型
    • redis速度比memcached快很多
    • redis可以持久化其数据

三、Redis最适用的场景

  • 会话缓存(Session Cache)

    • 最常用就是使用Redis做会话缓存。
    • Redis相比与其他存储的优势在于可持久化。
  • 全页缓存

    • 除基本的会话token之外,Redis还提供简便的全页缓存(FPC)平台。
    • 即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度下降。
  • 消息队列

    • Redis在内存存储引擎领域的最大一个优点就是提供list和set操作,这使得Redis能做为一个很好的消息队列平台来使用。
  • 排行榜/计数器

    • Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(set)和有序集合(Sorted Set)也使得我们在执行这些操作时变得非常简单,Redis只是正好提供了这两种数据结构。
  • 发布/订阅(Pub/Sub)

    • Redis自带的发布/订阅功能可使用场景非常多。可以在社交网络连接中使用,还可以作为基于发布/订阅的脚本触发器,甚至可以用来建立聊天系统。
  • 事务(Transactions)

    • 虽然 Redis 的 Transactions 提供的并不是严格的 ACID 的事务,但是这个 Transactions 还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间不会有其它客户端命令插进来执行)。
    • Redis 还提供了一个 Watch 功能,可以对一个 key 进行 Watch,然后再执行 Transactions,在这过程中,如果这个 Watched 的值进行了修改,那么这个 Transactions 会发现并拒绝执行。

参考文献:《Redis设计与实现》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值