Redis数据类型
Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String、List、Hash、Set和Sorted Set、bitMap,hyperLoglog。Redis数据类型内存结构分析
List应用场景:
String是最常用的一种数据类型,普通的key/value存储都可以归为此类。
常用命令:
(1)set 设置key对应的值为String类型的value
(2)get 获取key对应的值
(3)expire 设置过期时间
(4)type 查看值数据类型
(5)select 库号 选择查看指定的库数据
命令说明:
setnx设置key对应的值为String类型的value,如果key已经存在则返回0
setex设置key对应的值为String类型的value,并设定有效期
setrange设置key对应value的子字符串
getrange获取key对应value的子字符串
mset批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
msetnx同mset,不存在就设置,不会覆盖已有的key
getset设置key的值,并返回key旧的值
append给指定key的value追加字符串,并返回新字符串的长度
strlen取指定key的value的长度
Hash类型
Hash是一个String类型的field和value之间的映射表,即redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap,因此Hash特别适合存储对象。相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存。
Hash 数据类型内部结构示意图
当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
应用场景
用一个对象来存储用户信息,商品信息,订单信息等等。
List类型
Redis的List类型其实就是每一个元素都是String类型的双向链表。我们可以从链表的头部和尾部添加或者删除元素。这样的List既可以作为栈,也可以作为队列使用。
List数据结构内部示意图
应用场景
如好友列表,粉丝列表,消息队列,最新消息排行等。
常用命令
(1)lpush——在key对应的list的头部添加一个元素。
(2)lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素。
(3)lpop——从key对应的list的尾部删除一个元素,并返回该元素。
Set类型
Redis 集合(Set类型)是一个无序的String类型数据的集合,类似List的一个列表,与List不同的是Set不能有重复的数据。实际上,Set的内部是用HashMap实现的,Set只用了HashMap的key列来存储对象。我们来看看java中HashSet的源码:
可见创建一个HashSet的时候实际上创建了一个HashMap;Set中的元素,只是存放在了底层HashMap的key上,底层HashMap的value列为空,遍历HashSet的时候从HashMap中取出keySet来遍历。
Set底层结构示意图
应用场景
集合有取交集、并集、差集等操作,因此可以求共同好友、共同兴趣、分类标签等。
常用命令
(1)sadd——在key对应的set中添加一个元素。
(2)smembers——获取key对应的set的所有元素。
(3)spop——随机返回并删除key对应的set中的一个元素。
SortSet
SortSet顾名思义,是一个排好序的Set,它在Set的基础上增加了一个顺序属性score,这个属性在添加修改元素时可以指定,每次指定后,SortSet会自动重新按新的值排序。sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score。
应用场景
如按时间排序的时间轴。
常用命令
(1)zadd ——在key对应的zset中添加一个元素
(2)zrange——获取key对应的zset中指定范围的元素,-1表示获取所有元素
Redis常用命令
键值常用命令
keys/exits/del/expire/ttl/move/persist/randomkey/rename/type
服务器常用命令
ping/echo/select/quit/dbsize/info/config get/flushdb/flushall
Redis分布式存储的2种常见的方案:
1. 主从
2.cluster
Redis集群切片常见的方式:
1. 客户端切片,即在客户端就通过key的hash值对应到不同的服务器。
2. 对数据根据key散列到不同的slot上,不同的slot对应到不同服务器上。
Redis自增实现计数
计数器是 Redis 的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向 Redis 发送一个INCR命令。
比如在一个 web 应用程序中,如果想知道用户在一年中每天的点击量,那么只要将用户 ID 以及相关的日期信息作为键,并在每次用户点击页面时,执行一次自增操作即可。
比如用户名是peter,点击时间是 2012 年 3 月 22 日,那么执行命令INCRpeter::2012.3.22。
可以用以下几种方式扩展这个简单的模式:
可以通过组合使用INCR和EXPIRE,来达到只在规定的生存时间内进行计数(counting)的目的。
客户端可以通过使用GETSET命令原子性地获取计数器的当前值并将计数器清零,更多信息请参考GETSET命令。
使用其他自增/自减操作,比如DECR和INCRBY,用户可以通过执行不同的操作增加或减少计数器的值,比如在游戏中的记分器就可能用到这些命令。