数据类型和操作
前言
参考链接:http://www.redis.cn/topics/data-types.html
相关命令参考:http://redisdoc.com/
字符串(Strings)
判断key是否存在 EXISTS
127.0.0.1:6379> EXISTS name
(integer) 1 #1表示存在
127.0.0.1:6379> EXISTS namee
(integer) 0 #0表示不存在创建一个key并赋值 SET
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
#默认是不论key是否存在都进行设置(存在也会将之前的内容覆盖掉,不存在则新创建)
#EX seconds 以秒为单位设置过期时间
#PX milliseconds 以毫秒为单位设置过期时间
#NX,只在键不存在时,才对键进行设置操作(键存在则不操作)
#XX,只在键存在时,才对键进行设置操作(键不存在则不操作)
127.0.0.1:6379> SET key value #设置一个值
#设置一个hongbao key值为100,有效期为30秒
127.0.0.1:6379> SET hongbao 100 EX 30
OK
127.0.0.1:6379> TTL hongbao
(integer) 24
127.0.0.1:6379> TTL hongbao
(integer) 23
127.0.0.1:6379> TTL hongbao
(integer) -2 #-2表示已过期或空值
#XX 和 NX
127.0.0.1:6379> set www xxx XX
(nil)
127.0.0.1:6379> GET www
(nil)
127.0.0.1:6379> set www xxx NX
OK
127.0.0.1:6379> GET www
"xxx"获取单个值 GET
127.0.0.1:6379> GET two
"2"设置新值并返回旧值 GETSET
127.0.0.1:6379> set name azheng
OK
127.0.0.1:6379> getset name xiangzheng
"azheng"
127.0.0.1:6379> get name
"xiangzheng"一次设置多个key MSET
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> MSET one 1 two 2 three 3 #一次设置3个值
OK
127.0.0.1:6379> KEYS *
1) "two"
2) "one"
3) "three"一次获取多个key MGET
MGET key [key ...]
127.0.0.1:6379> MGET three one
1) "3"
2) "1"key后追加内容 APPEND
127.0.0.1:6379> get three
"linux"
127.0.0.1:6379> APPEND three " is good"
(integer) 12 #12表示字节,而非字符串数量
127.0.0.1:6379> get three
"linux is good"删除一个或多个key DEL
DEL key [key ...]
127.0.0.1:6379> DEL two
(integer) 1查看key的有效期 TTL
127.0.0.1:6379> TTL one
(integer) -1 #-1代表永久有效
127.0.0.1:6379> TTL one
(integer) 100 #100代表还有100秒失效
127.0.0.1:6379> TTL hongbao
(integer) -2 #-2表示已过期或空值重设key的有效期 EXPIRE
EXPIRE key seconds取消key的过期时间 PERSIST
- 即永不过期
PERSIST key
查看key的数据类型 TYPE
127.0.0.1:6379> TYPE three
string #字符串类型显示字节数 STRLEN
- 返回字符串key对应值的字节数
127.0.0.1:6379> set 姓名 项征
OK
127.0.0.1:6379> get 姓名
"\xe9\xa1\xb9\xe5\xbe\x81"
127.0.0.1:6379> strlen 姓名
(integer) 6数值递增 INCR
#INCR key
127.0.0.1:6379> set number 666
OK
127.0.0.1:6379> get number
"666"
127.0.0.1:6379> INCR number
(integer) 667
127.0.0.1:6379> get number
"667"
127.0.0.1:6379> INCR number
(integer) 668
127.0.0.1:6379> get number
"668"数值递减 DECR
#DECR name
127.0.0.1:6379> set number 666
OK
127.0.0.1:6379> get number
"666"
127.0.0.1:6379> DECR number
(integer) 665
127.0.0.1:6379> get number
"665"
127.0.0.1:6379> DECR number
(integer) 664
127.0.0.1:6379> get number
"664"数值增加 INCRBY
#INCRBY key increment
127.0.0.1:6379> set number 666
OK
127.0.0.1:6379> get number
"666"
127.0.0.1:6379> INCRBY number 10
(integer) 676
127.0.0.1:6379> get number
"676"
127.0.0.1:6379> INCRBY number 11
(integer) 687
127.0.0.1:6379> get number
"687"
#也支持负数,就是减
127.0.0.1:6379> INCRBY number -30
(integer) 657
127.0.0.1:6379> get number
"657"数值减少 DECRBY
#DECRBY key decrement
127.0.0.1:6379> set number 666
OK
127.0.0.1:6379> get number
"666"
127.0.0.1:6379> DECRBY number 30
(integer) 636
127.0.0.1:6379> get number
"636"
127.0.0.1:6379> DECRBY number 36
(integer) 600
127.0.0.1:6379> get number
"600"
#-50等于+50
127.0.0.1:6379> DECRBY number -88
(integer) 688
127.0.0.1:6379> get number
"688"列表(Lists)
- 列表是一个双向可读写的管道,其头部是左侧,尾部是右侧
- 一个列表最多可以包含2^32-1(4294967295)个元素
- 下标0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。
- 也可以使用负数下报,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,
- 常用于存入日志等场景,此数据类型比较常用
列表特点:
- 有序
- 元素值可以重复
- 左右都可以操作
生成列表并插入数据
#左推 LPUSH
127.0.0.1:6379> LPUSH listkey a b c
(integer) 3
127.0.0.1:6379> LRANGE listkey 0 -1
1) "c"
2) "b"
3) "a"
#右推 RPUSH
127.0.0.1:6379> RPUSH listkey2 a b c
(integer) 3
127.0.0.1:6379> LRANGE listkey2 0 -1
1) "a"
2) "b"
3) "c"获取列表长度 (元素个数) LLEN
127.0.0.1:6379> LLEN listkey
(integer) 3取列表中的内容 LRANGE LINDEX
#取0到1号的内容
lrange name 0 1
#取所有列表的内容
lrange name 0 -1
#取最后一个元素
lindex name -1
#取某一个元素
lindex name 3修改列表指定索引值 LSET
127.0.0.1:6379> RPUSH name a b c d e f
(integer) 6
127.0.0.1:6379> LRANGE name 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
#修改指定值
127.0.0.1:6379> LSET name 2 bbb #2表示的就是3,因为是从0开始的
OK
127.0.0.1:6379> LRANGE name 0 -1
1) "a"
2) "b"
3) "bbb"
4) "d"
5) "e"
6) "f"移除列表数据
#从左边弹
lpop
#从右边弹
rpop
#左弹
127.0.0.1:6379> LRANGE name 0 -1
1) "a"
2) "b"
3) "bbb"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> LPOP name
"a"
127.0.0.1:6379> LRANGE name 0 -1
1) "b"
2) "bbb"
3) "d"
4) "e"
5) "f"
#右弹
127.0.0.1:6379> LRANGE name 0 -1
1) "b"
2) "bbb"
3) "d"
4) "e"
5) "f"
127.0.0.1:6379> RPOP name
"f"
127.0.0.1:6379> LRANGE name 0 -1
1) "b"
2) "bbb"
3) "d"
4) "e"
#修剪
127.0.0.1:6379> LRANGE name 0 -1
1) "b"
2) "bbb"
3) "d"
4) "e"
127.0.0.1:6379> LTRIM name 1 2 #只留下1到2之间的元素
OK
127.0.0.1:6379> LRANGE name 0 -1
1) "bbb"
2) "d"
#删除全部元素
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> LRANGE name 0 -1
(empty list or set)集合(Set)
- set是string类型的无序集合
- 集合中的成员是唯一的,这就意味着集合中不能出现重复的数据
- 可以在两个不同的集合中对数据进行对比取值(取并集、交集、差集)
- 常用于数值判断、统计、交集等场景(可能认识的人就是取并集)
集合特点:
- 无序
- 无重复
- 集合间操作
生成集合key SADD
127.0.0.1:6379> SADD firends zhangsan lisi wangwu
(integer) 3
127.0.0.1:6379> SADD firends2 xiaoming xiaohong xiaoqiang
(integer) 3
127.0.0.1:6379> TYPE firends
set
127.0.0.1:6379> TYPE firends2
set追加数值 SADD
#追加时,只能追加不存在的数值,不能追加已存在的数值
127.0.0.1:6379> SADD set1 v1 v2 v2
(integer) 2
127.0.0.1:6379> SADD set1 v1 #已存在的数值不能追加
(integer) 0
127.0.0.1:6379> SADD set1 v6 #不存在的可以追加
(integer) 1
127.0.0.1:6379> TYPE set1
set查看集合的所有数据 SMEMBERS
127.0.0.1:6379> SMEMBERS set1
1) "v6"
2) "v2"
3) "v1"
127.0.0.1:6379> SMEMBERS firends
1) "lisi"
2) "zhangsan"
3) "wangwu"删除集合中的元素 SREM
127.0.0.1:6379> SMEMBERS set1
1) "v6"
2) "v2"
3) "v1"
127.0.0.1:6379> SREM set1 v6
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "v2"
2) "v1"集合间操作
127.0.0.1:6379> SMEMBERS value1
1) "wangjianlin"
2) "mayun"
3) "tony"
4) "leijun"
127.0.0.1:6379> SMEMBERS value2
1) "tangseng"
2) "baigujing"
3) "tony"
4) "wukong"
5) "mayun"
#取交集
#交集:属于A且属于B的元素称为A与B的交集(两个元素都存在的值)
127.0.0.1:6379> SINTER value1 value2
1) "mayun"
2) "tony"
#取并集
#并集:属于A或属于B的元素为称为A与B的并集(两个元素的所有值集合然后去重)
127.0.0.1:6379> SUNION value1 value2
1) "wangjianlin"
2) "tangseng"
3) "tony"
4) "leijun"
5) "baigujing"
6) "wukong"
7) "mayun"
#取差集
#差集:属于A而不属于B的元素称为A与B的差集(列出的是A有但是B没有的值)
127.0.0.1:6379> SDIFF value1 value2
1) "wangjianlin"
2) "leijun"有序集合(sorted set)
- redis有序集合和集合一样,也是string类型元素的集合且不允许有重复的成员,不同的是每个元素都会关联一个double(双精度浮点型)类型的分数,redis正是通过该分数来为集合中的成员进行从小到大的排序
- 有序集合的成员都是唯一的 不可重复,但分数(score)可以重复
- 集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)
- 集合中最大的成员数为2^32-1(4294976295,每个集合可存储40多亿个成员)
- 经常用于排行榜的场景
有序集合特点:
- 有序
- 无重复元素
- 每个元素是由score和value组成
- score 可以重复
- value 不可以重复
生成有序集合 ZADD
#1为分,v1为元素值,分数可以重复,元素值不可重复
127.0.0.1:6379> ZADD paihangbang 80 babai 75 wodejiaxiang 90 matrix 50 xiaoshidai 88 huapi
(integer) 5
127.0.0.1:6379> ZADD paihangbang 90 babai
(integer) 0
127.0.0.1:6379> TYPE paihangbang
zset有序集合实现排行榜
#默认是从小到大排序
127.0.0.1:6379> ZRANGE paihangbang 0 -1
1) "xiaoshidai"
2) "wodejiaxiang"
3) "huapi"
4) "babai"
5) "matrix"
#从大到小排序
127.0.0.1:6379> ZREVRANGE paihangbang 0 -1
1) "matrix"
2) "babai"
3) "huapi"
4) "wodejiaxiang"
5) "xiaoshidai"
#正序显示指定集合内所有key和得分情况
127.0.0.1:6379> ZRANGE paihangbang 0 -1 WITHSCORES
1) "xiaoshidai"
2) "50"
3) "wodejiaxiang"
4) "75"
5) "huapi"
6) "88"
7) "babai"
8) "90"
9) "matrix"
10) "90"
#倒序显示指定集合内所有key和得分情况
127.0.0.1:6379> ZREVRANGE paihangbang 0 -1 WITHSCORES
1) "matrix"
2) "90"
3) "babai"
4) "90"
5) "huapi"
6) "88"
7) "wodejiaxiang"
8) "75"
9) "xiaoshidai"
10) "50"获取集合的个数 ZCARD
127.0.0.1:6379> ZCARD paihangbang
(integer) 5基于索引返回数值 ZRANGE
127.0.0.1:6379> ZRANGE paihangbang 0 -1
1) "xiaoshidai"
2) "wodejiaxiang"
3) "huapi"
4) "babai"
5) "matrix"
#
127.0.0.1:6379> ZRANGE paihangbang 0 2
1) "xiaoshidai"
2) "wodejiaxiang"
3) "huapi"
#
127.0.0.1:6379> ZRANGE paihangbang 0 10 #超出范围不报错
1) "xiaoshidai"
2) "wodejiaxiang"
3) "huapi"
4) "babai"
5) "matrix"返回某个数值的索引排名
127.0.0.1:6379> ZRANK paihangbang huapi
(integer) 2 #从小到大排第三,因为从0开始
127.0.0.1:6379> ZRANK paihangbang wodejiaxiang
(integer) 1 #从小到大排第二,因为从0开始获取分数 ZSCORE
127.0.0.1:6379> ZSCORE paihangbang babai
"90"
127.0.0.1:6379> ZSCORE paihangbang xiaoshidai
"50"删除部分元素 ZREM
127.0.0.1:6379> ZRANGE paihangbang 0 -1
1) "xiaoshidai"
2) "wodejiaxiang"
3) "huapi"
4) "babai"
5) "matrix"
127.0.0.1:6379> ZREM paihangbang huapi babai
(integer) 2
127.0.0.1:6379> ZRANGE paihangbang 0 -1
1) "xiaoshidai"
2) "wodejiaxiang"
3) "matrix"
#删除有序集合
127.0.0.1:6379> del paihangbang
(integer) 1
127.0.0.1:6379> ZRANGE paihangbang 0 -1
(empty list or set)哈希(Hashes)
- hash是一个string类型的字段(field)和值(value)的映射表
- redis中每个hash可以存储2^32 -1键值对,类似于字典,存放了多个k/v对
- hash特别适合用于存储对象场景
生成 hash key
HSET key field value
127.0.0.1:6379> HSET 9527 name xiangzheng age 23
(integer) 2
127.0.0.1:6379> TYPE 9527
hash
---
127.0.0.1:6379> HSET 9527 name azheng age 23 city huludao #数值已存在则会覆盖
(integer) 1
127.0.0.1:6379> HGETALL 9527
1) "name"
2) "azheng" #
3) "age"
4) "23"
5) "city"
6) "huludao"
#查看所有字段的值
127.0.0.1:6379> HGETALL 9527
1) "name" #键
2) "xiangzheng" #值
3) "age" #键
4) "23" #值
#增加字段
127.0.0.1:6379> HSET 9527 gender man
(integer) 1
127.0.0.1:6379> HGETALL 9527
1) "name"
2) "azheng"
3) "age"
4) "23"
5) "city"
6) "huludao"
7) "gender"
8) "man"获取 hash key对应字段的值
127.0.0.1:6379> HGET 9527 name
"azheng"
127.0.0.1:6379> HGET 9527 age
"23"
#获取多个值
127.0.0.1:6379> HMGET 9527 city gender
1) "huludao"
2) "man"删除一个hash key的对应字段
127.0.0.1:6379> HGET 9527 city
"huludao"
127.0.0.1:6379> HDEL 9527 city
(integer) 1
127.0.0.1:6379> HGET 9527 city
(nil)批量设置hash key的多个field和value
127.0.0.1:6379> HGETALL 9527
1) "name"
2) "azheng"
3) "age"
4) "23"
5) "gender"
6) "man"
127.0.0.1:6379> HMSET 9527 name zhouxingxing age 50 city hongkong
OK
127.0.0.1:6379> HGETALL 9527
1) "name"
2) "zhouxingxing"
3) "age"
4) "50"
5) "gender"
6) "man"
7) "city"
8) "hongkong"获取hash中所有的字段名field(键)
127.0.0.1:6379> HKEYS 9527
1) "name"
2) "age"
3) "gender"
4) "city"获取hash key对应所有field的value
127.0.0.1:6379> HVALS 9527
1) "zhouxingxing"
2) "50"
3) "man"
4) "hongkong"