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指令

  1. 127.0.0.1:6379> set k1 v1
  2. OK
  3. 127.0.0.1:6379> type k1
  4. string
  5. 127.0.0.1:6379> get k1
  6. "v1"

del/exists指令

  1. 127.0.0.1:6379> DEL k1
  2. (integer) 1
  3. 127.0.0.1:6379> get k1
  4. (nil)
  5. 127.0.0.1:6379> EXISTS k1
  6. (integer) 0

mset/mget指令:同时设置多个键值对

  1. 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
  2. OK
  3. 127.0.0.1:6379> mget k1 k2 k3
  4. 1) "v1"
  5. 2) "v2"
  6. 3) "v3"

EXPIRE/TTL/setex

  1. 127.0.0.1:6379> set kkk vvv ex 100
  2. OK
  3. 127.0.0.1:6379> ttl kkk
  4. (integer) 97
  5. 127.0.0.1:6379> set k v
  6. OK
  7. 127.0.0.1:6379> EXPIRE k 10
  8. (integer) 1
  9. 127.0.0.1:6379> ttl k
  10. (integer) 6
  11. 127.0.0.1:6379> SETEX a 10 aaa
  12. OK
  13. 127.0.0.1:6379> ttl a
  14. (integer) 7

incr/decr/incrby/decrby

  1. 127.0.0.1:6379> set n 1
  2. OK
  3. 127.0.0.1:6379> INCR n
  4. (integer) 2
  5. 127.0.0.1:6379> get n
  6. "2"
  7. 127.0.0.1:6379> DECR n
  8. (integer) 1
  9. 127.0.0.1:6379> INCRBY n 100
  10. (integer) 101
  11. 127.0.0.1:6379> get n
  12. "101"
  13. 127.0.0.1:6379> DECRBY n 20
  14. (integer) 81
  15. 127.0.0.1:6379> get n
  16. "81"

SETNX/MSETNX

  1. 127.0.0.1:6379> set a 100
  2. OK
  3. 127.0.0.1:6379> SETNX a 200 #setnx如果存在key那么不做任何操作返回0
  4. (integer) 0
  5. 127.0.0.1:6379> get a
  6. "100"
  7. 127.0.0.1:6379> keys *
  8. 1) "a"
  9. 127.0.0.1:6379> MSETNX a 200 b 200 c 200 # 同时设置多个,该操作为原子操作,同时失败和成功
  10. (integer) 0
  11. 127.0.0.1:6379> keys *
  12. 1) "a"
  13. 127.0.0.1:6379> MSETNX b 200 c 200
  14. (integer) 1
  15. 127.0.0.1:6379> keys *
  16. 1) "a"
  17. 2) "c"
  18. 3) "b"

getset/move/append/strlen

  1. 127.0.0.1:6379> GETSET a 100 # 先获取key的值然后再执行set操作,如果不存在,就返回nil
  2. (nil)
  3. 127.0.0.1:6379> get a
  4. "100"
  5. 127.0.0.1:6379> GETSET a 200
  6. "100"
  7. 127.0.0.1:6379> get a
  8. "200"
  9. 127.0.0.1:6379> MOVE a 1 # 将本库的a移动到库1
  10. (integer) 1
  11. 127.0.0.1:6379> get a
  12. (nil)
  13. 127.0.0.1:6379> SELECT 1
  14. OK
  15. 127.0.0.1:6379[1]> get a
  16. "200"
  17. 127.0.0.1:6379> set b 123456
  18. OK
  19. 127.0.0.1:6379> APPEND b 789 # 在源字符串的基础上追加,返回追加后字符串的个数
  20. (integer) 9
  21. 127.0.0.1:6379> get b
  22. "123456789"
  23. 127.0.0.1:6379> STRLEN b # 返回字符串的个数
  24. (integer) 9

GETRANGE/SETRANGE

  1. 127.0.0.1:6379> GETRANGE b 0 -1 # 按照索引获取字符串,也就是字符串的切片
  2. "123456789"
  3. 127.0.0.1:6379> GETRANGE b 0 2
  4. "123"
  5. 127.0.0.1:6379> SETRANGE b 0 11 # 0代表offset,从哪个位置开始设置
  6. (integer) 9
  7. 127.0.0.1:6379> get b
  8. "113456789"

关于字符串key的设计

  1. 127.0.0.1:6379> MSET user:1:name jack user:1:age 50 user:2:name tony user:2:age 60
  2. OK
  3. 127.0.0.1:6379> keys *
  4. 1) "user:1:age"
  5. 2) "user:2:age"
  6. 3) "user:2:name"
  7. 4) "user:1:name"

2 list

官网关于list相关的指令:https://redis.io/commands#list

栈: 先进先出,喝多了吐
02 redis数据类型 - 图1
队列:先进后出,吃多了拉
02 redis数据类型 - 图2

LPUSH/RPUSH

  1. 127.0.0.1:6379> LPUSH list1 1 2 3 # 从左边插入
  2. (integer) 3
  3. 127.0.0.1:6379> RPUSH list1 4 # 从右边插入
  4. (integer) 4
  5. 127.0.0.1:6379> type list1
  6. list

LRANGE/LINDEX/LLEN

  1. 127.0.0.1:6379> LRANGE list1 0 -1 # 0 -> -1 代表获取改list所有的元素
  2. 1) "3"
  3. 2) "2"
  4. 3) "1"
  5. 4) "4"
  6. 127.0.0.1:6379> LINDEX list1 0 # 根据索引获取指定索引的元素
  7. "3"
  8. 127.0.0.1:6379> LLEN list1 # 计算该list元素个数
  9. (integer) 4

LPOP/RPOP

  1. 127.0.0.1:6379> LRANGE list1 0 -1
  2. 1) "3"
  3. 2) "2"
  4. 3) "1"
  5. 4) "4"
  6. 127.0.0.1:6379> LPOP list1 # 删除左侧第一个元素
  7. "3"
  8. 127.0.0.1:6379> RPOP list1 # 删除右侧第一个元素
  9. "4"
  10. 127.0.0.1:6379> LRANGE list1 0 -1
  11. 1) "2"
  12. 2) "1"
  13. 127.0.0.1:6379> LPUSH list1 3 4 5 6 7
  14. (integer) 7
  15. 127.0.0.1:6379> LRANGE list1 0 -1
  16. 1) "7"
  17. 2) "6"
  18. 3) "5"
  19. 4) "4"
  20. 5) "3"
  21. 6) "2"
  22. 7) "1"
  23. 127.0.0.1:6379> LPOP list1 3
  24. 1) "7"
  25. 2) "6"

LREM/LTRIM

  1. 127.0.0.1:6379> LPUSH list 1 1 2 2 3 3 4 5 6
  2. (integer) 9
  3. 127.0.0.1:6379>
  4. 127.0.0.1:6379> LREM list 1 1 # 第一个1代表count,第二个1代表元素,意思就是删除1一次元素1
  5. (integer) 1
  6. 127.0.0.1:6379> LRANGE list 0 -1
  7. 1) "6"
  8. 2) "5"
  9. 3) "4"
  10. 4) "3"
  11. 5) "3"
  12. 6) "2"
  13. 7) "2"
  14. 8) "1"
  15. 127.0.0.1:6379> LREM list 2 3 # 删除2次元素3
  16. (integer) 2
  17. 127.0.0.1:6379> LRANGE list 0 -1
  18. 1) "6"
  19. 2) "5"
  20. 3) "4"
  21. 4) "2"
  22. 5) "2"
  23. 6) "1"
  24. 127.0.0.1:6379> LTRIM list 0 3 # 按照索引保留list,本指令的意思是保留0-3的元素
  25. OK
  26. 127.0.0.1:6379> LRANGE list 0 -1
  27. 1) "6"
  28. 2) "5"
  29. 3) "4"
  30. 4) "2"

lset/linsert

  1. 127.0.0.1:6379> LPUSH list 1 2 3
  2. (integer) 3
  3. 127.0.0.1:6379> LSET list 0 1000 # 把索引0的元素设置为1000
  4. OK
  5. 127.0.0.1:6379> LRANGE list 0 -1
  6. 1) "1000"
  7. 2) "2"
  8. 3) "1"
  9. 127.0.0.1:6379> LINSERT list before 1000 2000 # 在元素1000之前添加元素2000
  10. (integer) 4
  11. 127.0.0.1:6379> LRANGE list 0 -1
  12. 1) "2000"
  13. 2) "1000"
  14. 3) "2"
  15. 4) "1"
  16. 127.0.0.1:6379> LINSERT list after 2000 3000 # 在元素2000之后加入元素3000
  17. (integer) 5
  18. 127.0.0.1:6379> LRANGE list 0 -1
  19. 1) "2000"
  20. 2) "3000"
  21. 3) "1000"
  22. 4) "2"
  23. 5) "1"

当添加一个元素时list不存在,那么会自动创建;
当一个list内的元素被删除完成后,那么list会被自动删除;

  1. 127.0.0.1:6379> LPOP list 5
  2. 1) "2000"
  3. 2) "3000"
  4. 3) "1000"
  5. 4) "2"
  6. 5) "1"
  7. 127.0.0.1:6379> LRANGE list 0 -1
  8. (empty array)
  9. 127.0.0.1:6379> EXISTS list
  10. (integer) 0

3 hashes

官网关于hashes相关指令:https://redis.io/commands#hash
HSET/HGET/HGETALL/HMGET

  1. 127.0.0.1:6379> HSET user:1 name jack age 100 sex male
  2. (integer) 3
  3. 127.0.0.1:6379> HGETALL user:1 # 获取该hashes内所有字段
  4. 1) "name"
  5. 2) "jack"
  6. 3) "age"
  7. 4) "100"
  8. 5) "sex"
  9. 6) "male"
  10. 127.0.0.1:6379> HGET user:1 name # 获取该hash内某一个字段的value
  11. "jack"
  12. "jack"
  13. 127.0.0.1:6379> HMGET user:1 name age # 获取hashes内多个字段的value
  14. 1) "jack"
  15. 2) "100"

HEXISTS/HLEN

  1. 127.0.0.1:6379> HEXISTS user:1 nmes # 判断某个hash内是否存在某字段
  2. (integer) 0
  3. 127.0.0.1:6379> HLEN user:1
  4. (integer) 3

HKEYS/HVALS

  1. 127.0.0.1:6379> HKEYS user:1
  2. 1) "name"
  3. 2) "age"
  4. 3) "sex"
  5. 127.0.0.1:6379> HVALS user:1
  6. 1) "jack"
  7. 2) "100"
  8. 3) "male"

4 SetS(无序的集合)

sets是无序的集合,并且元素是不会重复,每一个元素都是唯一的。

比如共同关注,等等都可以使用set来存放。

SADD/SMEMBERS

  1. 127.0.0.1:6379> SADD s1 1 2 3 4 5 # 添加元素
  2. (integer) 5
  3. 127.0.0.1:6379> SADD s2 3 4 5 6 7
  4. (integer) 5
  5. 127.0.0.1:6379> SMEMBERS s1 # 查看set内的元素
  6. 1) "1"
  7. 2) "2"
  8. 3) "3"
  9. 4) "4"
  10. 5) "5"
  11. 127.0.0.1:6379> SMEMBERS s2
  12. 1) "3"
  13. 2) "4"
  14. 3) "5"
  15. 4) "6"
  16. 5) "7"

SCARD/SISMEMBER

  1. 127.0.0.1:6379> SCARD s1 # 计算set内的元素个数
  2. (integer) 5
  3. 127.0.0.1:6379> SISMEMBER s1 1 # 是否存在某个元素
  4. (integer) 1

SDIFF/SINTER/SUNION

  1. 127.0.0.1:6379> SDIFF s1 s2 # s1之于s2不一样的
  2. 1) "1"
  3. 2) "2"
  4. 127.0.0.1:6379> SDIFF s2 s1 # s2之于s1不一样的
  5. 1) "6"
  6. 2) "7"
  7. 127.0.0.1:6379> SINTER s1 s2 # 两个set 相同的元素,交集
  8. 1) "3"
  9. 2) "4"
  10. 3) "5"
  11. 127.0.0.1:6379> SUNION s1 s2 # 两个set的并集
  12. 1) "1"
  13. 2) "2"
  14. 3) "3"
  15. 4) "4"
  16. 5) "5"
  17. 6) "6"
  18. 7) "7"
  19. 127.0.0.1:6379> SDIFFSTORE s3 s1 s2 # 将不同的元素存放至一个新的set:s3
  20. (integer) 2
  21. 127.0.0.1:6379> SMEMBERS s3
  22. 1) "1"
  23. 2) "2"
  24. 127.0.0.1:6379> SUNIONSTORE s4 s1 s2 # 将并集存在在新的set:s4
  25. (integer) 7
  26. 127.0.0.1:6379> SMEMBERS s4
  27. 1) "1"
  28. 2) "2"
  29. 3) "3"
  30. 4) "4"
  31. 5) "5"
  32. 6) "6"
  33. 7) "7"
  34. 127.0.0.1:6379> SINTERSTORE s5 s1 s2 # 将交集存放在新的set:s5
  35. (integer) 3
  36. 127.0.0.1:6379> SMEMBERS s5
  37. 1) "3"
  38. 2) "4"
  39. 3) "5"

SRANDMEMBER/SREM/SPOP

  1. 127.0.0.1:6379> SRANDMEMBER s1 2 # 随机选出两个元素
  2. 1) "5"
  3. 2) "4"
  4. 127.0.0.1:6379> SREM s1 1 # 删除某个元素
  5. (integer) 1
  6. 127.0.0.1:6379> SPOP s1 2 # 随机删除n个元素
  7. 1) "5"
  8. 2) "3"

5 Sorted sets(有序的集合)

官网关于Sorted set相关指令地址:https://redis.io/commands#sorted-set

ZADD/ZRANGE/ZREVRANGE/ZRANGEBYSCORE

  1. 127.0.0.1:6379> ZADD shuhan 100 liubei
  2. (integer) 1
  3. 127.0.0.1:6379> ZADD shuhan 99 guanyu
  4. (integer) 1
  5. 127.0.0.1:6379> ZADD shuhan 98 zhangfei
  6. (integer) 1
  7. 127.0.0.1:6379> ZADD shuhan 97 zhaoyun # 添加元素
  8. (integer) 1
  9. 127.0.0.1:6379> ZRANGE shuhan 0 -1 # 按照score排序
  10. 1) "zhaoyun"
  11. 2) "zhangfei"
  12. 3) "guanyu"
  13. 4) "liubei"
  14. 127.0.0.1:6379> ZRANGEBYSCORE shuhan -inf +inf # -inf正无穷 +INF负无穷
  15. 1) "zhaoyun"
  16. 2) "zhangfei"
  17. 3) "guanyu"
  18. 4) "liubei"
  19. 127.0.0.1:6379> ZRANGE shuhan 0 -1 withscores # 把元素的score同时打印出来
  20. 1) "zhaoyun"
  21. 2) "97"
  22. 3) "zhangfei"
  23. 4) "98"
  24. 5) "guanyu"
  25. 6) "99"
  26. 7) "liubei"
  27. 8) "100"
  28. 127.0.0.1:6379> ZREVRANGE shuhan 0 -1 # 按照score反向排序
  29. 1) "liubei"
  30. 2) "guanyu"
  31. 3) "zhangfei"
  32. 4) "zhaoyun"
  33. 127.0.0.1:6379> ZRANGEBYSCORE shuhan 90 99 # 搜索指定score内的元素并按照从小到大排序
  34. 1) "zhaoyun"
  35. 2) "zhangfei"
  36. 3) "guanyu"

ZCARD/ZCOUNT/ZRANK

  1. 127.0.0.1:6379> ZCARD shuhan # 获取元素个数
  2. (integer) 4
  3. 127.0.0.1:6379> ZCOUNT shuhan 90 100 # 获取指定score范围内的元素个数
  4. (integer) 4
  5. 127.0.0.1:6379> ZRANK shuhan liubei # 获取某个元素的排名(按照从小到大排序)
  6. (integer) 3

6 特殊数据类型一:bitmap

bit是位的意思,二进制位只有0和1两个数可存放。这种特性就决定了某些场景下使用该数据类型可以事半功倍。比如说考勤打卡,用户是否在线等。
官网关于bitmap相关指令操作:https://redis.io/commands#bitmap

SETBIT/BITCOUNT/GETBIT

  1. 127.0.0.1:6379> SETBIT user:1:kaoqin 1 1 # 设置周一是否打卡
  2. (integer) 0
  3. 127.0.0.1:6379> SETBIT user:1:kaoqin 2 1
  4. (integer) 0
  5. 127.0.0.1:6379> SETBIT user:1:kaoqin 3 0 # 设置周三手否打卡
  6. (integer) 0
  7. 127.0.0.1:6379> SETBIT user:1:kaoqin 4 1
  8. (integer) 0
  9. 127.0.0.1:6379> SETBIT user:1:kaoqin 5 1
  10. (integer) 0
  11. 127.0.0.1:6379> SETBIT user:1:kaoqin 6 0
  12. (integer) 0
  13. 127.0.0.1:6379> SETBIT user:1:kaoqin 7 0
  14. (integer) 0
  15. 127.0.0.1:6379> GETBIT user:1kaoqin 3 # 获取周三是否打卡
  16. (integer) 0
  17. 127.0.0.1:6379> BITCOUNT user:1:kaoqin # 统计打卡记录
  18. (integer) 4

7 特殊数据类型二:HyperLogLogs

关于HerperLogLogs相关指令官网地址:https://redis.io/commands#hyperloglog

基数统计,会存在0.81的误差率,统计网站访问量可以采用。

PFADD/PFCOUNT/PFMERGE

  1. 127.0.0.1:6379> PFADD p1 1 2 3 4 5 # 添加元素
  2. (integer) 1
  3. 127.0.0.1:6379> PFADD p2 3 4 5 6 7
  4. (integer) 1
  5. 127.0.0.1:6379> PFCOUNT p1 # 统计个数
  6. (integer) 5
  7. 127.0.0.1:6379> PFMERGE p p1 p2 # 合并p1 p2至p
  8. OK
  9. 127.0.0.1:6379> PFCOUNT p
  10. (integer) 7

8 特殊数据类型三:Geospatial

关于Geospatial相关指令官网地址:https://redis.io/commands#geo
地理位置信息统计,计算附件的人可以用。

GEOADD

  1. 127.0.0.1:6379> GEOADD china:city 116.40 39.90 beijing # 添加城市位置信息
  2. (integer) 1
  3. 127.0.0.1:6379> GEOADD china:city 121.47 31.23 shanghai
  4. (integer) 1
  5. 127.0.0.1:6379> GEOADD china:city 125.14 42.92 xian
  6. (integer) 1
  7. 127.0.0.1:6379> GEOADD china:city 113.28 23.12 guangzhou
  8. (integer) 1
  9. 127.0.0.1:6379> GEOADD china:city 114.05 22.54 shenzhen
  10. (integer) 1
  11. 127.0.0.1:6379> GEOADD china:city 125.32 43.88 changchun
  12. (integer) 1
  13. 127.0.0.1:6379> GEOADD china:city 102.71 25.04 kunming
  14. (integer) 1
  15. 127.0.0.1:6379> GEOADD china:city 91.13 29.66 lasa
  16. (integer) 1
  17. 127.0.0.1:6379> GEOADD china:city 111.48 33.13 xichuan
  18. (integer) 1
  1. 127.0.0.1:6379> GEODIST china:city beijing lasa # 计算北京到拉萨的直线距离
  2. "2561909.3908"
  3. 127.0.0.1:6379> GEODIST china:city beijing lasa km # 以km显示
  4. "2561.9094"
  5. 127.0.0.1:6379> GEOHASH china:city beijing # 获取北京value的hash值
  6. 1) "wx4fbxxfke0"
  7. 127.0.0.1:6379> GEORADIUS china:city 116.40 39.90 1000 km # 经纬度 1000km内的城市个数
  8. 1) "beijing"
  9. 2) "xian"
  10. 3) "changchun"
  11. 4) "xichuan"
  12. 127.0.0.1:6379> GEORADIUS china:city 116.40 39.90 1000 km count 2 # 只显示2个城市个数
  13. 1) "beijing"
  14. 2) "xian"

geo使用Sorted set实现,查看元素

  1. 127.0.0.1:6379> ZRANGE china:city 0 -1 withscores
  2. 1) "lasa"
  3. 2) "4016577355249274"
  4. 3) "kunming"
  5. 4) "4021138660984926"
  6. 5) "xichuan"
  7. 6) "4040392093884445"
  8. 7) "shenzhen"
  9. 8) "4046432260626848"
  10. 9) "guangzhou"
  11. 10) "4046533745880732"
  12. 11) "shanghai"
  13. 12) "4054803462927619"
  14. 13) "beijing"
  15. 14) "4069885360207904"
  16. 15) "xian"
  17. 16) "4266168390343129"
  18. 17) "changchun"
  19. 18) "4266518208519074"

获取元素的经纬度信息

  1. 127.0.0.1:6379> GEOPOS china:city beijing
  2. 1) 1) "116.39999896287918091"
  3. 2) "39.90000009167092543"