Redis的五种数据类型
键key的基本操作
-
key操作命令表
命令 功能 1 keys * 查看redis当前数据库中所有的键(kay) 2 set key值 value值 设置/插入 键值对 3 exists key值 查看该key是否存在,存在返回1,不存在返回0 4 type key值 该key对应的value的类型 5 del key值 删除指定key 6 unlink key值 异步删除指定key 7 expire key值 时间 对指定key设置有效时间,时间以秒为单位 8 ttl key值 查看指定key剩余的有效时间,-1表示永久有效,-2表示已过时 9 select 0-15 切换数据库,redis默认有16个数据库 10 dbsize 查看当前数据库中键值对的数量 11 flushdb 清除当前数据库中的所有键值对 12 flushall 清除所有数据库中的所有键值对(谨慎使用) -
操作终端展示
一、String类型数据
-
简介
String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
-
特色
① String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
② 一个Redis中字符串value最多可以是512M
-
String的数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M
-
原子性
所谓原子操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
(1)在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间。
(2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
Redis单命令的原子性主要得益于Redis的单线程。
-
基本操作命令
命令 功能 1 append key value 将给定的value值追加到原值的末尾 2 strlen key 获取指定key对应值的长度 3 setnx key value 只有在key不存在时,设置才会生效 4 incr key 将指定key对应的值自增1 5 decr key 将指定key对应的值自减1 6 mset k1 value1 k2 value2 … 同时设置一个或多个 key-value对 7 mget k1 k2 k3 同时获取一个或多个value值 8 msetnx k1 value1 k2 value2 … 同时设置一个或多个 key-value 对,
当且仅当所有给定 key 都不存在时生效(原子性)9 getrange key 起始位置 结束位置 获取该索引范围内的值 10 setrange key 起始位置 value 设置从该索引后的值,会覆盖 11 setex key 过期时间 value 设置键值对的同时,设置了过期时间 12 getset key value 以新换旧,设置了新值,同时获取旧值
二、List列表类型
-
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
-
数据结构
List的数据结构为快速链表quickList。
① 列表元素较少时
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
② 列表元素较多时
当数据量比较多的时候才会改成quicklist。
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
-
命令
1 lpush / rpush key value1 value2 … 从左边/右边插入一个或多个值 2 lpop / rpop 从左边/右边删除一个值。值光键亡 3 rpoplpush key1 key2 从key1的右边吐出一个值,插入key2的左边 4 lrange key startIndex endIndex 按照索引下标范围获取元素 5 lindex key index 获取指定索引对应的元素 6 llen key 获取指定列表的长度 7 linsert key before/after value newValue 在value的前面/后面插入新的value值 8 lrem key n value 从左边删除n个指定的value值 9 lset key index value 将key中指定下标处的值换成value
三、Set集合
-
简介
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,
① 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,
② set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
③ Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变
-
数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
-
命令
命令 功能 1 sadd key value1 value2 … 添加集合类的键值对 2 smembers key 取出key中所有的值 3 sismember key value 查看key中是否有该值 4 srandmember key n 随机取出key中的n个值 5 srem key value1 value2 … 删除key中指定的值 6 spop key n 随机吐出key中的n个值 7 smove key1 key2 value 将key1中指定的值移到key2中 8 sinter key1 key2 查看key1与key2的交集 9 sunion key1 key2 查看key1与key2的合集 10 sdiff key1 key2 查看key1与key2的差集
四、Hash哈希表
-
简介
Redis hash 是一个键值对集合。其中值是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
-
存储方式演变
如果用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息
-
数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
-
操作命令
命令 功能 1 hset key field1 value1 field2 value2 … 增加/修改键值对 2 hexists key field 判断键中是否有该对象 3 hkeys key 查看键中的所有field 4 hvals key 查看键中的所有field的值 5 hincrby key field n 将键中指定field的值增加n 6 hsetnx key field1 value1 field2 value2 … 增加key中不存在的field
五、Zset有序集合
-
简介
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。
集合的成员是唯一的,但是评分可以是重复的 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
-
数据结构
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两个数据结构
(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
-
命令
命令 功能 1 zadd key score1 value1 score2 value2 … 添加键值对 2 zrange key startIndex endIndex 返回有序集合中下标在该区间的成员 3 zrange key startIndex endIndex withscores 返回有序集合中下标在该区间的成员,带评分 4 zrangebyscore key min max 返回有序集合中评分在此区间的成员 5 zrangebyscore key min max withscores 返回有序集合中评分在此区间的成员,带评分 6 zrevrangebyscore key max min 倒序 7 zrevrangebyscore key max min withscores 8 zincrby key n value 为指定成员的评分加n 9 zrem key value 删除指定的成员 10 zcount key score1 score2 统计评分在此区间的成员个数 11 zrank key value 返回指定成员在有序集合中的排名,从0开始