redis(2)数据类型

一、数据类型

redis的数据结构是key-value的键值对的形式,但是它和传统String-String的键值对形式不一样,它的value不仅仅是string类型,而是有着丰富的数据类型,如:

1)string -> 二进制安全的,处理任何字符串,包括空字符串

2)list -> 有序链表结构的字符串集合

3)sets -> 无序值不重复的字符串集合

4)sorted sets -> 有序的sets字符串集合

5)hashes -> 存储键值为字符串的map

6)bit arrays -> 参数值为1或0,主要用于存储boolean类型的实时数据

7)hyperLogLogs -> 主要用于大元素的统计

下面会详细讲解各种类型

扫描二维码关注公众号,回复: 1808493 查看本文章

二、redis的keys

redis的key是二进制安全的字符串,你可以使用简单的"foo"字符串作为key,也可以使用JPED file的图片文件字符串序列作为key,甚至于一个空的字符串也是一个有效的key。

关于redis的key有一下几个原则:

1)不应使用过长的key:过长的key会提高查询成本,如果key不得不使用大的字符串值,可以哈希化

2)不应使用过短的key: 过短的key通常可读性非常差,如:u1000flw 和 user:1000:followers 明显后者的可读性较高。

3)推荐使用一定格式的key:如:object-type:id 模式:user:1000。:和 . 和 - 经常被用在key的表示中,如:comment:1000:reply-to 或者 comment:1000:reply.to

4) key的最大内存为512mb

三、string类型

string类型是最简单的类型,有很多的用途,如:可以用来缓存如html或者页面等数据。

简单的赋值和取值:

> set mykey somevalue
OK
> get mykey
"somevalue"

可以在赋值时设置参数,如:

在空值的时候设置值,否则失败

> set mykey newval nx
(nil)

在非空的时候设置值,否则失败

> set mykey newval xx
OK

可以做自增操作,自减操作类似(decr、decrby)

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

可以设置值并返回旧的值

> getset mykey 100
(nil)

可以同时设置多个值,取多个值(返回数组)

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

判断是否存在

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

判断类型

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

设置过期时间

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

查看剩余过期时间

> set key 100 ex 10
OK
> ttl key
(integer) 9

四、list

list是一个链表结构的集合,高效的新增操作,但是查询操作效率不搞,如果需要高效查询可以使用sorted set。

list经常用来存储最新的数据,以及发布/订阅模式中使用

添加操作

> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3

查询操作(0表示索引0, -1 表示倒数第一个)

> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

可以一次添加多个值

> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"

删除操作

> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

可以截取

> rpush mylist 1 2 3 4 5
(integer) 5
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"

支持阻塞(例如:如果没有值阻塞5秒钟以后执行)

> brpop tasks 5
1) "tasks"
2) "do_something"

五、hashes

哈希结构存储的是field-value的结构,你可以简单理解为map,如

设置和获取

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"

自增

> hincrby user:1000 birthyear 10
(integer) 1987
> hincrby user:1000 birthyear 10
(integer) 1997

六、sets

sets是一种无序的字符串集合,可以方便地用于取交集、并集

设置值查询值

> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2

判断是否存在某个值

> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0

添加多个值

> sadd news:1000:tags 1 2 5 77
(integer) 4

取交集

> sinter set1 set2

取并集

> sunion set1 set2

取并集数量

> sunionstore set1 set2

查询数量

> scard set

七、sorted set

有序的set,和set不同的地方在于sorted set是可以根据给定的score排序

添加

> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer) 1
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
> zadd hackers 1916 "Claude Shannon"
(integer) 1
> zadd hackers 1969 "Linus Torvalds"
(integer) 1
> zadd hackers 1912 "Alan Turing"
(integer) 1

查询(我们可以看到根据上面提供的score进行排序了)

> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"

反向排序

> zrevrange hackers 0 -1
1) "Linus Torvalds"
2) "Yukihiro Matsumoto"
3) "Sophie Wilson"
4) "Richard Stallman"
5) "Anita Borg"
6) "Alan Kay"
7) "Claude Shannon"
8) "Hedy Lamarr"
9) "Alan Turing"

连同score一起查出来

> zrange hackers 0 -1 withscores
1) "Alan Turing"
2) "1912"
3) "Hedy Lamarr"
4) "1914"
5) "Claude Shannon"
6) "1916"
7) "Alan Kay"
8) "1940"
9) "Anita Borg"
10) "1949"
11) "Richard Stallman"
12) "1953"
13) "Sophie Wilson"
14) "1957"
15) "Yukihiro Matsumoto"
16) "1965"
17) "Linus Torvalds"
18) "1969"

根据score上限查询

> zrangebyscore hackers -inf 1950
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"

根据score范围查询

> zremrangebyscore hackers 1940 1960
(integer) 4

获取元素的索引值

> zrank hackers "Anita Borg"
(integer) 4

八、bitmaps

bitmaps其实不属于一个实际的数据类型,它是基于string类型的。主要用于存储boolean类型的数据,也就是说你只能设置值如1或者0;由于string的最大内存空间为512mb,所以bitmaps的最大值为2^32bit最大值。

添加

> setbit key 10 1
(integer) 1
> getbit key 10
(integer) 1
> getbit key 11
(integer) 0

统计

> setbit key 0 1
(integer) 0
> setbit key 100 1
(integer) 0
> bitcount key
(integer) 2

九、hyperloglogs

redis在2.8.9版本中添加了hyperloglog结构,该结构主要用于统计算法。它不同于list存储元素本身,而是根据输入元素来计算基数

添加

> pfadd hll a b c d
(integer) 1

统计

> pfcount hll
(integer) 4

更多操作命令可以参考官方文档:https://redis.io/commands

猜你喜欢

转载自www.cnblogs.com/lay2017/p/9249093.html
今日推荐