基础数据类型有String、Map、List、Set、Zset五种;高级数据类型有Geospatial、Hyperloglog、Bitmaps。
String(字符串):
-
追加值:append key1 cao
-
查看键的长度:strlen key1
-
键值++:incr views(可以用来做网站访问量)
-
键值+num:incrby views 10(步长设置)
-
键值–:decr views
-
查看键(String)的范围子字符串:getrange key 0 3(全部:getrange key 0 -1)
-
替换(String)的范围子字符串:setrange key 1 xxx(比如“abcdefg”变成“axxxefg”)
-
不存在再设置:setnx mykey “redis”(如果mykey不存在,那么创建一个mykey;如果mykey已经存在,那么创建失败)
-
批量不存在再设置:msetnx k1 v1 k4 v4(结果是失败的,因为k1已存在,操作又是原子操作,整体就是失败的,所以k4没有被设置成功)
-
组合getset先获取value再set value:getset key1 sb
-
设置一个对象:set user:1 {name:hysen,age:21}
或者:mset user:1:name hysen user:2:age 21
前者使用的是json字符串作为值,后者吧user🆔field 看做一个key整体
List(列表):可以当做栈、队使用
- 从左边插入数据:lpush list one
- 从右边插入数据:rpush list two
- 从左边拿取数据:lindex list 1
- 从右边拿取数据:rindex list 1
- 从左边范围拿取数据:lrange list 0 1
- 从右边范围拿取数据:rrange list 0 1
- 从左边移除数据:lpop list
- 从右边移除数据:rpop list
- 组合命令将list1的数据拿出放入list2:rpoplpush list1 list2
- 移除list中指定个数的值:lrem list 2 three(移除2个值为three的值)
- 修剪数据:ltrim list 1 2(把下标在[1,2]之间的数据移除)
- 拿到List长度:llen list
- 在指定位置放入数据(前提是已经存在这个下标值key):lset list 2 hysen
- 在指定元素前/后插入数据:linsert list before/after “you” “love”
Set(集合)
- 添加成员: sadd myset “hello”
- 移除成员:srem myset hello随机移除成员:spop myset
- 查看所有成员:smembers myset
- 判断是否包含成员:sismember myset “hello”
- 获取集合中的元素个数:scard myset
- 随机获取成员:srandmember myset
- 移动成员到另一个集合中:smove myset1 myset2 “hysen”
- 查看集合1中集合2没有的元素(差集):sdiff set1 set2
- 查看交集:sinter set1 set2
- 查看并集:sunion set1 set2
Hash(哈希):更适合对象的存储
key是一个map,也就是key-value
- 添加成员:hset myhash field1 value1
- 批量添加成员:hmset myhash field1 value1 field2 value2
- 获取key中的value:hget myhash field1
- 批量获取key中的value:hmget myhash field1 field2
- 同时获取key中的key和value:hgetall myhash
- 删除成员:hdel myhash field1(同时删除了value1)
- 获取长度:hlen myhash(“键值对”的个数)
- 判断是否存在某key:hexists myhash field1
- 获取所有的key:hkeys myhash
- 获取所有的value:hvals myhash
- 自增:hincrby myhash field3 1
- 自减:hdecrby myhash field3 1
- 不存在则创建,存在不创建:hsetnx myhash field4 hello
- 存储对象:hset user:1 name qinjiang
Zset(有序集合)
在set的基础上增加了一个值,set k1 v1 -> zset k1 score1 v1.其中的score作用是zset根据score进行一个排序
- 添加成员:zadd myset 1 one
- 添加多个值:zadd myset 1 one 2 two移除成员:zrem myset xiaoming
- 查看成员个数:zcard myset
- 获取指定区间内的成员个数:zcount myset 100 200
- 范围查看:zrange myset 0 2排序后查看:zrangebyscore salary -inf +inf [withscores](其中-inf是负无穷,+inf是正无穷)
- 排序(逆序)查看:zrevrange salary 0 -1
Geospatial(地理位置): 底层是Zset实现的
推算地理位置的信息,两地之间的距离,方圆几里的人等。
- 添加地理位置(南北极无法添加,一般用Java程序可以一次性导入):geoadd china:city 116.40 39.90 beijing(经度,纬度,名称)
- 获取地理位置:geopos china:city beijing chongqing
- 获取两者间距离:geodist china:city beijing xian km
- 以一个经纬度为中心,找出某一半径内的所有元素(可以指定输出数量
- 同时获取距离、获取对方经纬度):georadius china:city 110.30 30.20 1000 km [withdist withcoord count 3]
- 以一个关键字为中心,找出某一半径内的所有元素:georadiusbymember china:city shanghai 1000 km
- 将二维的经纬度转化成一维的字符串(两个字符串越接近则距离越近):geohash china:city shanghai
Hyperloglog(基数)
基数就是一个集合内不重复的数,hyperloglog就是做基数统计的,比如说一个人访问一个网站多次,应该还算作是一个人的浏览。按理说也可以用set来实现这个事,但是Hyperloglog实现的话,不必存储用户ID,不管是什么技术什么数据结构,占用的内存都是固定的12kb。有0.18%的错误率。
- 添加成员:pfadd mykey a b c d e f g a d e
- 查看基数:pcount mykey a b c d b c d(结果是4)
- 合并:pfmerge newkey mykey mykey1
Bitmaps
用来统计只有两个状态的事物,比如说打卡/未打卡,只有0和1两个状态。
- 设置某一个位置上的bit值:setbit sign 2 1
- 查看某一歌位置上的状态:getbit sign 2
- 统计1状态的个数:bitcount sign