redis提供了8中数据类型,其中5中常用的数据类型有:
- string:字符串,也是最常用的数据类型;
- list:列表
- hashes:哈希,可以理解为Python中的字典或者Java中的map;
- set:集合,无序的并且无重复元素的数据集;
- sorted sets:有序的集合,多用于排序场景的使用;
3中特殊的数据类型:
- bitmap:位存储,只有0和1两种结果;
- hyperloglogs:基数统计,有0.81%的容错,对统计误差可以接受的场景下使用;
- geospatial:地理位置信息,计算附近的人之类的应用可以使用;
1 String
官网关于string相关命令:https://redis.io/commands#string
set/get指令
127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> type k1string127.0.0.1:6379> get k1"v1"
del/exists指令
127.0.0.1:6379> DEL k1(integer) 1127.0.0.1:6379> get k1(nil)127.0.0.1:6379> EXISTS k1(integer) 0
mset/mget指令:同时设置多个键值对
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3OK127.0.0.1:6379> mget k1 k2 k31) "v1"2) "v2"3) "v3"
EXPIRE/TTL/setex
127.0.0.1:6379> set kkk vvv ex 100OK127.0.0.1:6379> ttl kkk(integer) 97127.0.0.1:6379> set k vOK127.0.0.1:6379> EXPIRE k 10(integer) 1127.0.0.1:6379> ttl k(integer) 6127.0.0.1:6379> SETEX a 10 aaaOK127.0.0.1:6379> ttl a(integer) 7
incr/decr/incrby/decrby
127.0.0.1:6379> set n 1OK127.0.0.1:6379> INCR n(integer) 2127.0.0.1:6379> get n"2"127.0.0.1:6379> DECR n(integer) 1127.0.0.1:6379> INCRBY n 100(integer) 101127.0.0.1:6379> get n"101"127.0.0.1:6379> DECRBY n 20(integer) 81127.0.0.1:6379> get n"81"
SETNX/MSETNX
127.0.0.1:6379> set a 100OK127.0.0.1:6379> SETNX a 200 #setnx如果存在key那么不做任何操作返回0(integer) 0127.0.0.1:6379> get a"100"127.0.0.1:6379> keys *1) "a"127.0.0.1:6379> MSETNX a 200 b 200 c 200 # 同时设置多个,该操作为原子操作,同时失败和成功(integer) 0127.0.0.1:6379> keys *1) "a"127.0.0.1:6379> MSETNX b 200 c 200(integer) 1127.0.0.1:6379> keys *1) "a"2) "c"3) "b"
getset/move/append/strlen
127.0.0.1:6379> GETSET a 100 # 先获取key的值然后再执行set操作,如果不存在,就返回nil(nil)127.0.0.1:6379> get a"100"127.0.0.1:6379> GETSET a 200"100"127.0.0.1:6379> get a"200"127.0.0.1:6379> MOVE a 1 # 将本库的a移动到库1(integer) 1127.0.0.1:6379> get a(nil)127.0.0.1:6379> SELECT 1OK127.0.0.1:6379[1]> get a"200"127.0.0.1:6379> set b 123456OK127.0.0.1:6379> APPEND b 789 # 在源字符串的基础上追加,返回追加后字符串的个数(integer) 9127.0.0.1:6379> get b"123456789"127.0.0.1:6379> STRLEN b # 返回字符串的个数(integer) 9
GETRANGE/SETRANGE
127.0.0.1:6379> GETRANGE b 0 -1 # 按照索引获取字符串,也就是字符串的切片"123456789"127.0.0.1:6379> GETRANGE b 0 2"123"127.0.0.1:6379> SETRANGE b 0 11 # 0代表offset,从哪个位置开始设置(integer) 9127.0.0.1:6379> get b"113456789"
关于字符串key的设计
127.0.0.1:6379> MSET user:1:name jack user:1:age 50 user:2:name tony user:2:age 60OK127.0.0.1:6379> keys *1) "user:1:age"2) "user:2:age"3) "user:2:name"4) "user:1:name"
2 list
官网关于list相关的指令:https://redis.io/commands#list
栈: 先进先出,喝多了吐
队列:先进后出,吃多了拉
LPUSH/RPUSH
127.0.0.1:6379> LPUSH list1 1 2 3 # 从左边插入(integer) 3127.0.0.1:6379> RPUSH list1 4 # 从右边插入(integer) 4127.0.0.1:6379> type list1list
LRANGE/LINDEX/LLEN
127.0.0.1:6379> LRANGE list1 0 -1 # 0 -> -1 代表获取改list所有的元素1) "3"2) "2"3) "1"4) "4"127.0.0.1:6379> LINDEX list1 0 # 根据索引获取指定索引的元素"3"127.0.0.1:6379> LLEN list1 # 计算该list元素个数(integer) 4
LPOP/RPOP
127.0.0.1:6379> LRANGE list1 0 -11) "3"2) "2"3) "1"4) "4"127.0.0.1:6379> LPOP list1 # 删除左侧第一个元素"3"127.0.0.1:6379> RPOP list1 # 删除右侧第一个元素"4"127.0.0.1:6379> LRANGE list1 0 -11) "2"2) "1"127.0.0.1:6379> LPUSH list1 3 4 5 6 7(integer) 7127.0.0.1:6379> LRANGE list1 0 -11) "7"2) "6"3) "5"4) "4"5) "3"6) "2"7) "1"127.0.0.1:6379> LPOP list1 31) "7"2) "6"
LREM/LTRIM
127.0.0.1:6379> LPUSH list 1 1 2 2 3 3 4 5 6(integer) 9127.0.0.1:6379>127.0.0.1:6379> LREM list 1 1 # 第一个1代表count,第二个1代表元素,意思就是删除1一次元素1(integer) 1127.0.0.1:6379> LRANGE list 0 -11) "6"2) "5"3) "4"4) "3"5) "3"6) "2"7) "2"8) "1"127.0.0.1:6379> LREM list 2 3 # 删除2次元素3(integer) 2127.0.0.1:6379> LRANGE list 0 -11) "6"2) "5"3) "4"4) "2"5) "2"6) "1"127.0.0.1:6379> LTRIM list 0 3 # 按照索引保留list,本指令的意思是保留0-3的元素OK127.0.0.1:6379> LRANGE list 0 -11) "6"2) "5"3) "4"4) "2"
lset/linsert
127.0.0.1:6379> LPUSH list 1 2 3(integer) 3127.0.0.1:6379> LSET list 0 1000 # 把索引0的元素设置为1000OK127.0.0.1:6379> LRANGE list 0 -11) "1000"2) "2"3) "1"127.0.0.1:6379> LINSERT list before 1000 2000 # 在元素1000之前添加元素2000(integer) 4127.0.0.1:6379> LRANGE list 0 -11) "2000"2) "1000"3) "2"4) "1"127.0.0.1:6379> LINSERT list after 2000 3000 # 在元素2000之后加入元素3000(integer) 5127.0.0.1:6379> LRANGE list 0 -11) "2000"2) "3000"3) "1000"4) "2"5) "1"
当添加一个元素时list不存在,那么会自动创建;
当一个list内的元素被删除完成后,那么list会被自动删除;
127.0.0.1:6379> LPOP list 51) "2000"2) "3000"3) "1000"4) "2"5) "1"127.0.0.1:6379> LRANGE list 0 -1(empty array)127.0.0.1:6379> EXISTS list(integer) 0
3 hashes
官网关于hashes相关指令:https://redis.io/commands#hash
HSET/HGET/HGETALL/HMGET
127.0.0.1:6379> HSET user:1 name jack age 100 sex male(integer) 3127.0.0.1:6379> HGETALL user:1 # 获取该hashes内所有字段1) "name"2) "jack"3) "age"4) "100"5) "sex"6) "male"127.0.0.1:6379> HGET user:1 name # 获取该hash内某一个字段的value"jack""jack"127.0.0.1:6379> HMGET user:1 name age # 获取hashes内多个字段的value1) "jack"2) "100"
HEXISTS/HLEN
127.0.0.1:6379> HEXISTS user:1 nmes # 判断某个hash内是否存在某字段(integer) 0127.0.0.1:6379> HLEN user:1(integer) 3
HKEYS/HVALS
127.0.0.1:6379> HKEYS user:11) "name"2) "age"3) "sex"127.0.0.1:6379> HVALS user:11) "jack"2) "100"3) "male"
4 SetS(无序的集合)
sets是无序的集合,并且元素是不会重复,每一个元素都是唯一的。
比如共同关注,等等都可以使用set来存放。
SADD/SMEMBERS
127.0.0.1:6379> SADD s1 1 2 3 4 5 # 添加元素(integer) 5127.0.0.1:6379> SADD s2 3 4 5 6 7(integer) 5127.0.0.1:6379> SMEMBERS s1 # 查看set内的元素1) "1"2) "2"3) "3"4) "4"5) "5"127.0.0.1:6379> SMEMBERS s21) "3"2) "4"3) "5"4) "6"5) "7"
SCARD/SISMEMBER
127.0.0.1:6379> SCARD s1 # 计算set内的元素个数(integer) 5127.0.0.1:6379> SISMEMBER s1 1 # 是否存在某个元素(integer) 1
SDIFF/SINTER/SUNION
127.0.0.1:6379> SDIFF s1 s2 # s1之于s2不一样的1) "1"2) "2"127.0.0.1:6379> SDIFF s2 s1 # s2之于s1不一样的1) "6"2) "7"127.0.0.1:6379> SINTER s1 s2 # 两个set 相同的元素,交集1) "3"2) "4"3) "5"127.0.0.1:6379> SUNION s1 s2 # 两个set的并集1) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"127.0.0.1:6379> SDIFFSTORE s3 s1 s2 # 将不同的元素存放至一个新的set:s3(integer) 2127.0.0.1:6379> SMEMBERS s31) "1"2) "2"127.0.0.1:6379> SUNIONSTORE s4 s1 s2 # 将并集存在在新的set:s4(integer) 7127.0.0.1:6379> SMEMBERS s41) "1"2) "2"3) "3"4) "4"5) "5"6) "6"7) "7"127.0.0.1:6379> SINTERSTORE s5 s1 s2 # 将交集存放在新的set:s5(integer) 3127.0.0.1:6379> SMEMBERS s51) "3"2) "4"3) "5"
SRANDMEMBER/SREM/SPOP
127.0.0.1:6379> SRANDMEMBER s1 2 # 随机选出两个元素1) "5"2) "4"127.0.0.1:6379> SREM s1 1 # 删除某个元素(integer) 1127.0.0.1:6379> SPOP s1 2 # 随机删除n个元素1) "5"2) "3"
5 Sorted sets(有序的集合)
官网关于Sorted set相关指令地址:https://redis.io/commands#sorted-set
ZADD/ZRANGE/ZREVRANGE/ZRANGEBYSCORE
127.0.0.1:6379> ZADD shuhan 100 liubei(integer) 1127.0.0.1:6379> ZADD shuhan 99 guanyu(integer) 1127.0.0.1:6379> ZADD shuhan 98 zhangfei(integer) 1127.0.0.1:6379> ZADD shuhan 97 zhaoyun # 添加元素(integer) 1127.0.0.1:6379> ZRANGE shuhan 0 -1 # 按照score排序1) "zhaoyun"2) "zhangfei"3) "guanyu"4) "liubei"127.0.0.1:6379> ZRANGEBYSCORE shuhan -inf +inf # -inf正无穷 +INF负无穷1) "zhaoyun"2) "zhangfei"3) "guanyu"4) "liubei"127.0.0.1:6379> ZRANGE shuhan 0 -1 withscores # 把元素的score同时打印出来1) "zhaoyun"2) "97"3) "zhangfei"4) "98"5) "guanyu"6) "99"7) "liubei"8) "100"127.0.0.1:6379> ZREVRANGE shuhan 0 -1 # 按照score反向排序1) "liubei"2) "guanyu"3) "zhangfei"4) "zhaoyun"127.0.0.1:6379> ZRANGEBYSCORE shuhan 90 99 # 搜索指定score内的元素并按照从小到大排序1) "zhaoyun"2) "zhangfei"3) "guanyu"
ZCARD/ZCOUNT/ZRANK
127.0.0.1:6379> ZCARD shuhan # 获取元素个数(integer) 4127.0.0.1:6379> ZCOUNT shuhan 90 100 # 获取指定score范围内的元素个数(integer) 4127.0.0.1:6379> ZRANK shuhan liubei # 获取某个元素的排名(按照从小到大排序)(integer) 3
6 特殊数据类型一:bitmap
bit是位的意思,二进制位只有0和1两个数可存放。这种特性就决定了某些场景下使用该数据类型可以事半功倍。比如说考勤打卡,用户是否在线等。
官网关于bitmap相关指令操作:https://redis.io/commands#bitmap
SETBIT/BITCOUNT/GETBIT
127.0.0.1:6379> SETBIT user:1:kaoqin 1 1 # 设置周一是否打卡(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 2 1(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 3 0 # 设置周三手否打卡(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 4 1(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 5 1(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 6 0(integer) 0127.0.0.1:6379> SETBIT user:1:kaoqin 7 0(integer) 0127.0.0.1:6379> GETBIT user:1kaoqin 3 # 获取周三是否打卡(integer) 0127.0.0.1:6379> BITCOUNT user:1:kaoqin # 统计打卡记录(integer) 4
7 特殊数据类型二:HyperLogLogs
关于HerperLogLogs相关指令官网地址:https://redis.io/commands#hyperloglog
基数统计,会存在0.81的误差率,统计网站访问量可以采用。
PFADD/PFCOUNT/PFMERGE
127.0.0.1:6379> PFADD p1 1 2 3 4 5 # 添加元素(integer) 1127.0.0.1:6379> PFADD p2 3 4 5 6 7(integer) 1127.0.0.1:6379> PFCOUNT p1 # 统计个数(integer) 5127.0.0.1:6379> PFMERGE p p1 p2 # 合并p1 p2至pOK127.0.0.1:6379> PFCOUNT p(integer) 7
8 特殊数据类型三:Geospatial
关于Geospatial相关指令官网地址:https://redis.io/commands#geo
地理位置信息统计,计算附件的人可以用。
GEOADD
127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing # 添加城市位置信息(integer) 1127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai(integer) 1127.0.0.1:6379> GEOADD china:city 125.14 42.92 xian(integer) 1127.0.0.1:6379> GEOADD china:city 113.28 23.12 guangzhou(integer) 1127.0.0.1:6379> GEOADD china:city 114.05 22.54 shenzhen(integer) 1127.0.0.1:6379> GEOADD china:city 125.32 43.88 changchun(integer) 1127.0.0.1:6379> GEOADD china:city 102.71 25.04 kunming(integer) 1127.0.0.1:6379> GEOADD china:city 91.13 29.66 lasa(integer) 1127.0.0.1:6379> GEOADD china:city 111.48 33.13 xichuan(integer) 1
127.0.0.1:6379> GEODIST china:city beijing lasa # 计算北京到拉萨的直线距离"2561909.3908"127.0.0.1:6379> GEODIST china:city beijing lasa km # 以km显示"2561.9094"127.0.0.1:6379> GEOHASH china:city beijing # 获取北京value的hash值1) "wx4fbxxfke0"127.0.0.1:6379> GEORADIUS china:city 116.40 39.90 1000 km # 经纬度 1000km内的城市个数1) "beijing"2) "xian"3) "changchun"4) "xichuan"127.0.0.1:6379> GEORADIUS china:city 116.40 39.90 1000 km count 2 # 只显示2个城市个数1) "beijing"2) "xian"
geo使用Sorted set实现,查看元素
127.0.0.1:6379> ZRANGE china:city 0 -1 withscores1) "lasa"2) "4016577355249274"3) "kunming"4) "4021138660984926"5) "xichuan"6) "4040392093884445"7) "shenzhen"8) "4046432260626848"9) "guangzhou"10) "4046533745880732"11) "shanghai"12) "4054803462927619"13) "beijing"14) "4069885360207904"15) "xian"16) "4266168390343129"17) "changchun"18) "4266518208519074"
获取元素的经纬度信息
127.0.0.1:6379> GEOPOS china:city beijing1) 1) "116.39999896287918091"2) "39.90000009167092543"
