Redis之五大数据类型与操作

Redis的五大数据类型

  • String(字符串)
  • List(列表)
  • Set(集合)
  • Hash(哈希,类似Java里的map)
  • Zset(有序集合)

key(键)操作

keys查找所有符合给定模式( pattern)的 key :

127.0.0.1:6379> get test
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "k1"

del key删除指定的key:

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

exists key的名字,判断某个key是否存在,0:不存在;1:存在:

127.0.0.1:6379> exists k1
(integer) 0
127.0.0.1:6379> exists k2
(integer) 1

move key db将当前数据库的 key 移动到给定的数据库 db 当中:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> move k2 1
(integer) 1
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k2
"v2"

expire key seconds为给定的key设置过期时间(秒):

127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> expire k1 3
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> keys *
(empty list or set)

ttl key查看还有多少秒过期,-1:永不过期,-2:已过期:

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> expire k1 10
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 7
127.0.0.1:6379> ttl k1
(integer) 6
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> ttl k2
(integer) -1

type key查看key所储存的值的类型:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> lpush k3 1 2 3
(integer) 3
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> type k1
string
127.0.0.1:6379> type k3
list

数据类型操作

String(字符串)

string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value;

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象;

string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M;

set设置指定key的值:

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"

get获取指定key的值:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"

del 删除指定key:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"

append在指定key的值得末尾追加指定字符串:

127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 xxx
(integer) 5
127.0.0.1:6379> get k1
"v1xxx"

strlen获取key的值的长度:

127.0.0.1:6379> get k1
"v1xxx"
127.0.0.1:6379> strlen k1
(integer) 5

incr将key中储存的数字值增一(只能操作数字):

127.0.0.1:6379> incr k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> incr k1
(integer) 2
127.0.0.1:6379> incr k1
(integer) 3
127.0.0.1:6379> get k1
"3"
127.0

decr将key中储存的数字值减一(只能操作数字)

127.0.0.1:6379> get k1
"3"
127.0.0.1:6379> decr k1
(integer) 2
127.0.0.1:6379> get k1
"2"

incrby将key中储存的数字值加上给定的增量值:

127.0.0.1:6379> get k1
"1"
127.0.0.1:6379> incrby k1 2
(integer) 3
127.0.0.1:6379> get k1
"3"

decrby将key中储存的数字值减去给定的减量值:

127.0.0.1:6379> get k1
"3"
127.0.0.1:6379> decrby k1 2
(integer) 1
127.0.0.1:6379> get k1
"1"

getrange获取指定key的范围区间的字符串:

127.0.0.1:6379> get k1
"12345"
127.0.0.1:6379> getrange k1 0 2
"123"

setrange使用指定字符串覆盖给定key所储存的字符串值,覆盖位置从给定下标开始:

127.0.0.1:6379> get k1
"12345"
127.0.0.1:6379> setrange k1 2 xx
(integer) 5
127.0.0.1:6379> get k1
"12xx5"

setex设置带过期时间的key:

127.0.0.1:6379> get k1
"12xx5"
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> setex k1 20 v1
OK
127.0.0.1:6379> ttl k1
(integer) 19

setnx只有当key不存在时才设置key的值:

127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> setnx k1 xxx
(integer) 0
127.0.0.1:6379> get k1
"v1"

mset同时设置单个或多个key的值,如果key存在将覆盖此key的值,如果key不存在将创建此key:

127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> mset k1 v1x k2 v2x k3 v3x
OK
127.0.0.1:6379> get k1
"v1x"
127.0.0.1:6379> get k2
"v2x"
127.0.0.1:6379> get k3
"v3x"

mget同时获取单个或者多个key的值,key不存在时则返回空:

127.0.0.1:6379> mget k1 k2 k3
1) "v1x"
2) "v2x"
3) "v3x"
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1x"
2) "v2x"
3) "v3x"
4) (nil)

msetnx当key都不存在时,同时设置单个或者多个key的值,如果给定的key有已经存在的,将都不会设置成功:

127.0.0.1:6379> msetnx k1 v1 k4 v3
(integer) 0
127.0.0.1:6379> get k1
"v1x"
127.0.0.1:6379> get k4
(nil)
127.0.0.1:6379> mset k4 v4 k5 v5
OK
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379> get k5
"v5"

getset先设置key的值再返回key的旧值:

127.0.0.1:6379> getset k1 123
"v1x"

List(列表)

Redis列表是简单的字符串列表,允许有重复的值,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。

它的底层实际是个链表

lpush将一个或多个值插入列表头部:

127.0.0.1:6379> lpush list 1 2 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lpush list 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

rpush将一个或多个值插入列表尾部:

127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> rpush list 0
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "0"

lrange获取指定范围内的列表元素:

127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "0"
127.0.0.1:6379> lrange list 0 1
1) "4"
2) "3"

lpop从列表头部弹出一个元素:

127.0.0.1:6379> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "0"
127.0.0.1:6379> lpop list
"4"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "0"

rpop从列表尾部弹出一个元素:

127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "0"
127.0.0.1:6379> rpop list
"0"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"

lindex按照索引下标获得元素(从上到下):

127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lindex list 1
"2"

llen获取列表长度:

127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> llen list
(integer) 3

lrem从列表中删除N个指定value的值,如果N是0表示全部删除:

127.0.0.1:6379> lpush list2 1 1 2 2 3 3
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"
4) "2"
5) "1"
6) "1"
127.0.0.1:6379> lrem list2 1 2
(integer) 1
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
5) "1"
127.0.0.1:6379> lrem list2 0 1
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"

ltrim截取指定范围的元素,其它元素将被删除:

127.0.0.1:6379> lpush list3 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lrange list3 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> ltrim list3 1 3
OK
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "4"
3) "3"

rpoplpush移除一个列表最后一个元素,并添加到另一个列表的头部:

127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list2 0 -1
1) "3"
2) "3"
3) "2"
127.0.0.1:6379> rpoplpush list list2
"1"
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "3"
3) "3"
4) "2"

lset设置列表指定下标的值:

127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "4"
3) "3"
127.0.0.1:6379> lset list3 1 x
OK
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "x"
3) "3"

linsert在列表已存在的某个元素的前面或者后面插入元素:

127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "x"
3) "3"
127.0.0.1:6379> linsert list3 before x mysql
(integer) 4
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "mysql"
3) "x"
4) "3"
127.0.0.1:6379> linsert list3 after x oracle
(integer) 5
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "mysql"
3) "x"
4) "oracle"
5) "3"

Set(集合)

Redis的Set是string类型的无序集合,不允许有重复的值,它是通过HashTable实现实现的。

sadd向集合中添加一个或者多个元素:

127.0.0.1:6379> sadd set1 1 2 3 4
(integer) 4

smembers查看集合中的所有元素:

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"

sismember判断集合中是否存在某个元素:

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sismember set1 1
(integer) 1
127.0.0.1:6379> sismember set1 a
(integer) 0

scard获取指定集合的元素个数:

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> scard set1
(integer) 4

srem删除指定集合中的一个或者多个元素:

127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> srem set1 1
(integer) 1
127.0.0.1:6379> smembers set1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> srem set1 2 3
(integer) 2
127.0.0.1:6379> smembers set1
1) "4"

srandmember随机获取指定集合中的N个元素,如果超出最大数量则全部获取:

127.0.0.1:6379> sadd set2 1 2 3 4 5 6 7
(integer) 7
127.0.0.1:6379> smembers set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
127.0.0.1:6379> srandmember set2 3
1) "7"
2) "6"
3) "3"

spop随机出栈:

127.0.0.1:6379> smembers set2
1) "a"
2) "7"
3) "6"
4) "5"
5) "3"
6) "4"
7) "2"
8) "1"
9) "b"
127.0.0.1:6379> spop set2
"a"
127.0.0.1:6379> spop set2
"2"
127.0.0.1:6379> smembers set2
1) "3"
2) "5"
3) "6"
4) "7"
5) "b"
6) "4"
7) "1"

smove将指定集合中的元素移动到另外一个集合中:

127.0.0.1:6379> smembers set1
1) "4"
127.0.0.1:6379> smembers set2
1) "3"
2) "5"
3) "6"
4) "7"
5) "b"
6) "4"
7) "1"
127.0.0.1:6379> smove set2 set1 b
(integer) 1
127.0.0.1:6379> smembers set1
1) "b"
2) "4"
127.0.0.1:6379> smembers set2
1) "3"
2) "5"
3) "6"
4) "7"
5) "4"
6) "1"

sdiff获取两个集合的差集:

127.0.0.1:6379> sadd set1 a b c d e
(integer) 5
127.0.0.1:6379> smembers set1
1) "b"
2) "a"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> sadd set2 a b c f g
(integer) 5
127.0.0.1:6379> smembers set2
1) "b"
2) "a"
3) "c"
4) "f"
5) "g"
127.0.0.1:6379> sdiff set1 set2
1) "e"
2) "d"

sinter获取两个集合的交集:

127.0.0.1:6379> smembers set1
1) "b"
2) "a"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> smembers set2
1) "a"
2) "b"
3) "c"
4) "f"
5) "g"
127.0.0.1:6379> sinter set1 set2
1) "b"
2) "a"
3) "c"

sunion获取两个集合的并集,会自动去掉重复元素:

127.0.0.1:6379> smembers set1
1) "b"
2) "a"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> smembers set2
1) "a"
2) "b"
3) "c"
4) "f"
5) "g"
127.0.0.1:6379> sunion set1 set2
1) "b"
2) "a"
3) "c"
4) "e"
5) "d"
6) "f"
7) "g"

Hash(哈希,类似Java里的map)

Redis hash是一个键值对集合,是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>

hset将哈希表指定key中的字段field的值设为value:

127.0.0.1:6379> hset user username admin
(integer) 1

hget获取指定key的哈希表中字段的值:

127.0.0.1:6379> hget user username
"admin"

hmset同时设置指定key的哈希表的一个或者多个字段的值:

127.0.0.1:6379> hmset user gender 男 age 25
OK

hmget同时获取指定key的哈希表的一个或者多个字段的值:

127.0.0.1:6379> hmget user username age
1) "admin"
2) "25"

hgetall获取哈希表中指定key的所有字段和值:

127.0.0.1:6379> hgetall user
1) "username"
2) "admin"
3) "gender"
4) "\xe7\x94\xb7"
5) "age"
6) "25"

hdel删除指定哈希表中的一个或者多个字段:

127.0.0.1:6379> hdel user gender
(integer) 1
127.0.0.1:6379> hgetall user
1) "username"
2) "admin"
3) "age"
4) "25"
127.0.0.1

hlen获取指定哈希表中字段数量:

127.0.0.1:6379> hgetall user
1) "username"
2) "admin"
3) "age"
4) "25"
127.0.0.1:6379> hlen user
(integer) 2

hexists判断指定哈希表中是否存在某个字段:

127.0.0.1:6379> hexists user gender
(integer) 0
127.0.0.1:6379> hexists user age
(integer) 1

hkeys获取指定哈希表中所有字段:

127.0.0.1:6379> hkeys user
1) "username"
2) "age"

hvals获取指定哈希表中的所有值:

127.0.0.1:6379> hvals user
1) "admin"
2) "25"

hincrby将指定哈希表中的字段值加上增量值:

127.0.0.1:6379> hget user age
"25"
127.0.0.1:6379> hincrby user age 3
(integer) 28
127.0.0.1:6379> hget user age
"28"

hincrbyfloat将指定哈希表中的字段值加上浮点数增量值:

127.0.0.1:6379> hset user score 55.5
(integer) 1
127.0.0.1:6379> hget user score
"55.5"
127.0.0.1:6379> hincrbyfloat user score 0.5
"56"
127.0.0.1:6379> hget user score
"56"

hsetnx设置指定哈希表中的字段值,如果字段存在则不设置,如果不存在则设置:

127.0.0.1:6379> hsetnx user age 22
(integer) 0
127.0.0.1:6379> hsetnx user email [email protected]
(integer) 1

Zset(sorted set 有序集合)

Redis zset 和 set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。

redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

zadd向集合中添加一个或者多个元素:

127.0.0.1:6379> zadd zset1 1 c 2 a 3 d
(integer) 3

zrange获取指定区间的集合有序元素:

127.0.0.1:6379> zadd zset1 1 c 2 a 3 d
(integer) 3
127.0.0.1:6379> zrange zset1 0 -1
1) "c"
2) "a"
3) "d"

zrange withscores获取指定区间的集合带分数值的有序元素:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
5) "d"
6) "3"

zrangebyscore通过分数值获取指定区间的集合的有序元素:

127.0.0.1:6379> zrange zset1 0 -1
1) "c"
2) "a"
3) "d"
127.0.0.1:6379> zrangebyscore zset1 1 2
1) "c"
2) "a"

zrangebyscore通过分数值获取指定区间的集合带分数值的有序元素:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
5) "d"
6) "3"
127.0.0.1:6379> zrangebyscore zset1 1 2 withscores
1) "c"
2) "1"
3) "a"
4) "2"

zrem删除指定集合中的元素:

127.0.0.1:6379> zrange zset1 0 -1
1) "c"
2) "a"
3) "d"
127.0.0.1:6379> zrem zset1 d
(integer) 1
127.0.0.1:6379> zrange zset1 0 -1
1) "c"
2) "a"

zcard获取集合元素个数:

127.0.0.1:6379> zrange zset1 0 -1
1) "c"
2) "a"
127.0.0.1:6379> zcard zset1
(integer) 2

zcount统计指定集合分数区间的元素个数:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
127.0.0.1:6379> zcount zset1 0 1
(integer) 1

zrank获取指定集合元素的下标位置:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
127.0.0.1:6379> zrank zset1 c
(integer) 0
127.0.0.1:6379> zrank zset1 a
(integer) 1

zscore获取指定集合元素的分数:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
127.0.0.1:6379> zscore zset1 c
"1"

zrevrange获取指定集合元素,按照分数倒序:

127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
1) "a"
2) "2"
3) "c"
4) "1"

zrevrangebyscore根据分数获取指定区间集合元素,按照分数倒序:

127.0.0.1:6379> zrevrangebyscore zset1 1 0 withscores
1) "c"
2) "1"
127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "c"
2) "1"
3) "a"
4) "2"
127.0.0.1:6379> zrevrangebyscore zset1 1 0 withscores
1) "c"
2) "1"
发布了107 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/chen_changying/article/details/103338956