常见数据类型
String字符串
简介
String是最基本的数据类型,是二进制安全的,一个key对应一个value
常用命令
1.set <key> <value> :添加键值对
2.get <key>:查询对应键值对
3.append <key> <value>:将给定的值添加到原值的末尾
4.strlen <key>:获取值的长度
5.setnx <key> <value>:设置值;只有key不存在时才能设置;如果存在就设置不成功,不会覆盖
6.incr <key>:将key中存储的数字加一,只能对数字操作,如果为空,就新增值为1
7.decr <key>:将key中存储的数字减一,只能对数字操作,如果为空,就新增值为-1
8.incrby/decrby <key> <步长>:将key中的数字增减,自定义步长
9.mset <key1> <key2> <key3>...:同时设置多个键值对
10.mget <key1> <key2> <key3>...:同时获取多个value
11.msetnx <key1> <value1> <key2> <value2>:同时设置一个或多个键值对,仅当key不存在(具有原子性,有一个失败全部失败)
12.getrange <key> <起始位置> <结束位置>:获取值的范围
13.setrange <key> <起始位置> <value>:用<value>覆写<key>所存储的字符串值,从<起始位置>开始
14.setex <key> <过期时间> <value> :设置键值的同时设置过期时间,单位为秒
15.getset <key> <value>:以旧换新,设置新值同时获取了旧值
数据结构
String的数据结构是动态字符串;是可以修改的字符串,采用预分配冗余空间的方式来减少内存的频繁分配。
内部为当前字符串分配的空间一般要高于实际长度;当字符串的长度小于1M时,扩容都是加倍现有空间,如果超过1M,扩容时一次只会多扩展1M的空间。字符串的最大长度为512M。
List列表
简介
单键多值;
是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部;底层是双向链表,对两端的操作性能很高,通过索引下标操作中间的元素性能较差
常用命令
1.lpush/rpush <key> <value1> <value2> <value3>....,:从左边或者右边插入一个或多个值
2.lpop/rpop <key> :从左边或者右边读出值,读出后键值消失
3.rpoplpush <key1> <key2>:从key1列表的右边读出一个值,插入到<key2>的左边
4.lrange <key> <start> <stop>:按照索引下标获取元素(从左到右)
如:lrange <key> 0 -1:0是左边第一个,-1是右边第一个;(0 -1表示获取所有)
5.lindex <key> <index>:按照下标获取元素(从左到右)
6.llen <key> :获取列表长度
7.linsert <key> before <value> <newvalue> :在<value>后插入<newvalue>值
8.lrem <key> <n> <value>:从左边删除n个value(从左到右)
9.lset <key> <index> <value>:将列表key下标为index的值替换为<value>
数据结构
Redis3.2前,底层是用压缩列表zipList、双向循环链表linkedList
Redis3.2及之后的底层实现方式:quickList(quickList)
Hash哈希
简介
是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象
常用命令
1.HDEL <key>field2 [field2]:删除一个或多个hash字段。
2.HEXISTS <key> field:确定hash字段是否存在。
3.HGET <key> field:获取存储在指定键处的hash字段的值。
4.HGETALL <key>:获取按指定键存储在hash中的所有字段和值
5.HINCRBY <key>field increment:将哈希字段的整数值递增到给定的数字
6.HINCRBYFLOAT <key> field increment :将哈希字段的浮点值按给定的量递增
7.HKEYS <key>:获取hash中的所有字段
8.HLEN <key>:获取hash中的字段数
9.HMGET <key> field1 [field2] :获取所有给定哈希字段的值
10.HMSET <key> field1 value1 [field2 value2 ] :将多个哈希字段设置为多个值
11.HSET <key> field value:设置hash字段的字符串值
12.HSETNX <key> field value :仅在hash字段不存在时设置该字段的值
13.HVALS <key> :获取hash中的所有值
14.HSCAN <key> cursor [MATCH pattern] [COUNT count] :递增地迭代哈希字段和关联值
数据结构
hash底层的结构是 ziplist 和 hashtable
默认情况下:
-
当ziplist中entry的数量超过512的时候,会转成hashtable
-
单个元素的值超过64字节的时候,会转成hashtable
Set集合
简介
set对外提供的功能与list类似,特殊之处在于可以自动排重;同时提供了判断某个成员是否在集合内的判断;
是一个无序集合,其底层是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。
常用命令
1.sadd <key> <value1> <value2> <value3>:将一个或者多个元素加入到集合中,已经存在的被忽略
2.smembers <key>:取出该值的所有集合
3.sismember <key> <value>:判断集合<key> 是否含有该<value>的值,有1,没有0
4.scard <key>:返回集合个数
5.srem <key> <value1> <value2> ...:删除集合中的某个元素
6.spop <key>:随机从集合中吐出一个值
7.srandmember <key> <n>:随机从该集合中取出n个值,不会从集合中删除
8.smove <key1> <key2>:返回两个集合中的元素交集
9.sunion <key1> <key2>:返回两个集合中的元素并集
10.sdiff <key1> <key2>:返回两个集合的元素差集(key1中的,不包含key2)
数据结构
set的数据结构是dict字典,字典是用hash表实现的
ZSet有序集合
简介
Redis有序集合zset 与普通集合set非常相似;
Zset是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。
常用命令
1.zadd <key><score1><value1><score2><value2>... :将一个或多个member元素及其score值加入到有序集key当中。
2.zrange <key><start><stop>[WITHSCORES]:返回有序集key中,下标在<start><stop>之间的元素
3.zrangebyscore key min max [withscores] [limit offset count]:返回有序集 key 中,所有score值介于min和max 之间(包括等于min或max )的成员
4.zincrby <key><increment><value>:为元素的score加上增量
5.zrem <key><value>:删除该集合下,指定值的元素v
6.zcount <key><min><max>:统计该集合,分数区间内的元素个数。
7.zrank <key><value>:返回该值在集合中的排名,从0开始。
数据结构
zset底层使用了两个数据结构。
(1) hash , hash 的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。
新数据类型
BitMaps
简介
BitMap可以理解为存储bit的数组,多个bit存储后组成的一个特定结构,每个位置只能存储1和0
常用命令
1.setbit <key> <offset> <value>:
设置bitmap中的值,指定offset,即下标,从0开始
2.get <key> <offset>:
获取bitmap的值,指定offset下标,有则返回1,没有则返回0,不存在的下标也返回0
3.bitcount <key> [start end]:
统计设置为1的bit数量,可以指定获取的范围
4.bitop <operation> <destkey> <keys...>:
bitop可以进行多种操作是一个复合操作, 它可以对多个Bitmaps做and(交集) 、 or(并集) 、 not(非) 、 xor(异或) 等操作,将结果保存在目标destkey中
注意
需要注意一点,所说Bitmaps能够节省内存,但是并不适用所有情况。
假设网站有1000万用户,但是其中的活跃用户只有10万。此时Bitmaps存储了绝大多数的僵尸用户,但是bit位的值都是0,是无效的,只有百分之一的利用率,还是浪费了绝大部分的内存。
而如果使用map或者set存储这10万用户,可能还用不了这么多内存
HyperLogLog
简介
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的
常用方法
1.PFADD <key> element [element …]:添加
2.PFCOUNT <key>:获得基数值
3.PFMERGE <key1> <key2>: 合并多个key值
Geospatial
简介
地理空间(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