1.字符串
String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。
String是Redis最基本的类型,是二进制安全的,意味着Redis的string可以包含任何数据,比如jpg图片。
一个redis中字符串value最大是512M
常用命令
set 添加键值对
get 查询对应键值
append 将给定的追加到原值的末尾
strlen 获得值得长度
setnx 只有在key不存在时 设置key的值
incr
将key中存储的数字值增1
只能对数字值操作,如果为空,新增值为1
decr
将key中存储的数字减1
只能对数字值操作,如果为空,新增值为-1
incrby / decrby <步长> 将key中存储的数字值增减。自定义步长
mset …
同时设置一个或多个键值对
mget …
同时获取一个或多个value
msetnx …
同时设置一个或多个key-value对,当且仅当所有给定key都不存在。(原子性操作)
getrange <起始位置><结束位置>
获得值得范围,包括起始和终止位置
setrange <起始位置>
用 覆写所存储的字符串值,从<起始位置>开始(索引从0开始)
setex <过期时间>
设置键值的同时,设置过期时间,单位秒
getset
设置新值同时获取旧值
2.列表List
单键多值
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边),底层实际是个双向链表
Lpush:表示的是向链表的左添加,也就是向链表的头添加
Rpush:表示的是向链表的右添加,也就是向链表的尾添加
常用命令
lpush/push… … 从左边/右边插入一个或多个值。
lpop/rpop 从左边/右边吐出一个值。值在键就在,值无键亡。
rpoplpush 从列表右边吐出一个值,插到列表左边。
lrange
按照索引下标获得元素(从左到右)
lrange mylist 0-1 0左边第一个,-1右边第一个,(0-1表示获取所有)
lindex 按照索引下标获得元素(从左到右)
llen 获得列表长度,
linsert before 在的后面插入插入值lrem
从左边删除n个value(从左到右)
lset 将列表key下标为index的值替换成value
数据结构
List的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成
quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的
数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。
这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
3.集合Set
Redis 的集合是字符串的无序集合。
在Set集合当中,是不允许有重复的。
set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集.
与list类似是一个列表的功能,特殊在于set可自动去重。Redis的Set是string类型的无序集合,它底层其实是一个value为null的hash表,添加,删除,查找复杂度都是O(1)
常用命令
sadd … 将一个或多个member元素加入到集合key中,已经存在的
member元素将被忽略
smembers 取出该集合的所有值。,
sismember判断集合是否为含有该值,有1,没有0scard返回
该集合的元素个数。,
srem …删除集合中的某个元素。,spop 随机从该集合中吐出一
个值。
srandmember 随机从该集合中取出n个值。不会从集合中删除。
smove value 把集合中一个值从一个集合移动到另一个集合·
sinter 返回两个集合的交集元素。
sunion 返回两个集合的并集元素。
sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)
数据结构
Set数据结构是dict字典,字典是用哈希表实现的
内部使用hash结构,所有的value都指向同一个内部值
4.Zset
Redis 的有序集合类似于 Redis 的集合,字符串不重复的集合。
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序
集合的每个成员都关联了一个评分(score ) ,这个评分( score )被用来按照从最低分到最高分的方
式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。
因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position)来获取一个范围的
元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列
表。
常用命令:
zadd … 将一个或多个member元素及其score值
加入到有序集key当中。
uzrangie
间的元素
带WITHSCORES,可以让分数一起和值返回到结果集。
vzrangebyscore key minmax [withscores] [limit offset count] 返回有序集key中,所有
score值介于min和max之间(包括等于min或 max )的成员。有序集成员按score值递增(从小到大)
次序排列。
zrevrangebyscore key maxmin [withscores] [limit offset count] 同上,改为从大到小排列。
zincrby 为元素的score加上增量.zrem 删除该集合
下,指定值的元素
zcount 统计该集合,分数区间内的元素个数zrank 返回该值
在集合中的排名,从0开始。
数据结构
zset是Redis提供的一个特别的数据结构,一方面等价于Java的数据结构Map<String,Double>,可
以给每一个元素value赋予一个权重score,另一方面又类似于TreeSet,内部的元素会按照权重
score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两种数据结构
(1)hash,作用是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找
到相应的score值
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
5.哈希Hash
Redis 的哈希是键值对的集合。
Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象,还有用户信息之类的,经常变动的信息。
Hash更适合用于对象的存储,String更适合字符串存储。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长
度较短且个数较少时,使用ziplist,否则使用hashtable
常用命令
hset 给集合中的键赋值
hget 从集合取出value v
hmset … 批量设置hash的值
hexists 查看哈希表key 中,给定域field是否存在。“
hkeys 列出该hash集合的所有field
hvals 列出该hash集合的所有 valuee
hincrby 为哈希表key中的域field 的值加上增量1 -1
hsetnx 将哈希表key中的域field 的值设置为value,当且仅当域field不存在
数据结构
Hash类型对应的数据结构是两种: ziplist(压缩列表),hashtable(哈希表)。当field-value长度较
短且个数较少时,使用ziplist,否则使用hashtable。