String是最基本的数据类型,是二进制安全的,一个key对应一个value
1.set
2.get
3.append
4.strlen
5.setnx
6.incr
7.decr
8.incrby/decrby
9.mset
10.mget
11.msetnx
12.getrange
13.setrange
14.setex
15.getset
String的数据结构是动态字符串;是可以修改的字符串,采用预分配冗余空间的方式来减少内存的频繁分配。
内部为当前字符串分配的空间一般要高于实际长度;当字符串的长度小于1M时,扩容都是加倍现有空间,如果超过1M,扩容时一次只会多扩展1M的空间。字符串的最大长度为512M。
单键多值;
是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部;底层是双向链表,对两端的操作性能很高,通过索引下标操作中间的元素性能较差
1.lpush/rpush
2.lpop/rpop
3.rpoplpush
4.lrange
如:lrange
5.lindex
6.llen
7.linsert
8.lrem
9.lset
Redis3.2前,底层是用压缩列表zipList、双向循环链表linkedList
Redis3.2及之后的底层实现方式:quickList(quickList)
是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象
1.HDEL
2.HEXISTS
3.HGET
4.HGETALL
5.HINCRBY
6.HINCRBYFLOAT
7.HKEYS
8.HLEN
9.HMGET
10.HMSET
11.HSET
12.HSETNX
13.HVALS
14.HSCAN
hash底层的结构是 ziplist 和 hashtable
默认情况下:
当ziplist中entry的数量超过512的时候,会转成hashtable
单个元素的值超过64字节的时候,会转成hashtable
set对外提供的功能与list类似,特殊之处在于可以自动排重;同时提供了判断某个成员是否在集合内的判断;
是一个无序集合,其底层是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。
1.sadd
2.smembers
3.sismember
4.scard
5.srem
6.spop
7.srandmember
8.smove
9.sunion
10.sdiff
set的数据结构是dict字典,字典是用hash表实现的
Redis有序集合zset 与普通集合set非常相似;
Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。
1.zadd
2.zrange
3.zrangebyscore key min max [withscores] [limit offset count]:返回有序集 key 中,所有score值介于min和max 之间(包括等于min或max )的成员
4.zincrby
5.zrem
6.zcount
7.zrank
zset底层使用了两个数据结构。
(1) hash , hash 的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
BitMap可以理解为存储bit的数组,多个bit存储后组成的一个特定结构,每个位置只能存储1和0
1.setbit
设置bitmap中的值,指定offset,即下标,从0开始
2.get
获取bitmap的值,指定offset下标,有则返回1,没有则返回0,不存在的下标也返回0
3.bitcount
统计设置为1的bit数量,可以指定获取的范围
4.bitop
bitop可以进行多种操作是一个复合操作, 它可以对多个Bitmaps做and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 等操作,将结果保存在目标destkey中
需要注意一点,所说Bitmaps能够节省内存,但是并不适用所有情况。
假设网站有1000万用户,但是其中的活跃用户只有10万。此时Bitmaps存储了绝大多数的僵尸用户,但是bit位的值都是0,是无效的,只有百分之一的利用率,还是浪费了绝大部分的内存。
而如果使用map或者set存储这10万用户,可能还用不了这么多内存
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的
1.PFADD
2.PFCOUNT
3.PFMERGE
地理空间(geospatial),主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set;推算地理位置的信息,两地之间的距离,周围方圆的人等等场景都可以用它实现
1.geoadd key longitude latitude member [longitude latitude member …]:添加地理位置,可以将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中
2.geopos key member [member …]:获取指定城市的地理位置经纬度,可以从 key 里返回所有给定地理位置的经纬度
3.geodist key member1 member2 [unit]:返回两个坐标之间的距离,也就是两个人之间的距离(指定单位的参数 unit)
4.georadius key lopngitude latitude radius unit [WITHCOORD] [WITHDIST] [COUNT count] [ASC|DESC] […]:以给定的经纬度为中心,返回与中心的距离不超过给定最大距离的所有位置元素
5.georadiusbymember key member radius unit […(跟 georadius 一致)]:都可以找出位于指定范围的位置元素,但是这里不是指定中心点坐标,而是指定以哪个元素为中心点
6.geohash key member [member …]:将二维的经纬度转换成一维的字符串,也就是对经纬度进行 hash 计算
geo 底层原理是使用 zset来实现的,因此我们也可以使用 zset 的命令操作 geo