首页 > IT职业 > IT生活 > Redis入门教程(二)— 基本数据类型
阅读以下内容时,手边打开一个redis-cli一起输入,输入命令敲击回车键前在心中想好你的答案,如果结果不合你的预期,请分析原因,使极大地提高学习效率。如果没有条件,每个数据类型后有代码运行结果,供你参考。
Reids作为一个key-value型存储系统,下面我们就分别从key和value说起:
key
key支持非二进制安全的字符类型(not binary-safe strings)。它不支持空格和换行等,key的命名一般建议使用object-type:id:field,即对象类型 :对象ID:对象属性方式。
对于key的命名,不要太长,占内存,导致查询慢;不要太短,显然car:1:color比c:1:c的可读性高太多
key的相关操作:
exists car
del car
type car
randomkey
rename car train
renamenx car train
dbsize
expire train 60
ttl train
move key 1
flushdb
flushall
Value
Redis有这丰富的数据类型,包括Strings,Hashes,Lists,Sets和Ordered Sets
1. 字符串 Strings
字符串类型是Redis中最基本的数据类型,它可以存储任何形式的字符串,包括二进制数据。可以用它存储用户的邮箱、JSON话的对象甚至是一张图片。一个字符串类型键允许存储的数据最大容量是512MB。
字符串类型是其他4中数据类型的基础,其他数据类型和字符串类型的差别从某种角度来说只是组织字符串的形式不同。
set age 101
setnx price 101
get age
getrange age 0 1
getset age 12
mset age1 1 age2 2
mget age1 age2
setex age3 60 3
strlen age
incr age
incrby age 12
incrbyfloat price 12.4
decr age
decrby age 12
append age years
127.0.0.1:6379> set age 101
OK
127.0.0.1:6379> setnx price 101
(integer) 1
127.0.0.1:6379> get age
"101"
127.0.0.1:6379> getrange age 0 1
"10"
127.0.0.1:6379> getset age 12
"101"
127.0.0.1:6379> mset age1 1 age2 2
OK
127.0.0.1:6379> mget age1 age2
1) "1"
2) "2"
127.0.0.1:6379> setex age3 60 3
OK
127.0.0.1:6379> strlen age
(integer) 2
127.0.0.1:6379> incr age
(integer) 13
127.0.0.1:6379> incrby age 12
(integer) 25
127.0.0.1:6379> incrbyfloat price 12.4
"113.4"
127.0.0.1:6379> decr age
(integer) 24
127.0.0.1:6379> decrby age 12
(integer) 12
127.0.0.1:6379> append age years
(integer) 7 2. 哈希 Hashes
哈希类型是一个String类型的字段(field)和字段值(value)的映射表,字段值只能是字符串,换句话说,散列类型不能嵌套其他的数据类型,每个hash可以存储2^32-1键值对(40多亿)。
提示:除了散列类型,Redis的其他数据类型同样不支持数据类型嵌套。比如集合类型的每个元素都只能是字符串,不能是另一个集合或散列表等。
散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。例如要存储ID为2的汽车对象,可以分别使用名为color、name和price的3个字段存储该汽车的颜色、名称和价格:
hset car price 500
hset car name BMW
hset car color red hset student name zhangsan
hsetnx student age 12
hmset student sex boy address beijing
hget student name
hmget student name age
hgetall student
hexists student name
hincrby student age 1
hincrbyfloat student age 1.2
hdel student age address
hvals student
hkeys student
hlen student
127.0.0.1:6379> hset student name zhangsan
(integer) 1
127.0.0.1:6379> hsetnx student age 12
(integer) 1
127.0.0.1:6379> hmset student sex boy address beijing
OK
127.0.0.1:6379> hget student name
"zhangsan"
127.0.0.1:6379> hmget student name age
1) "zhangsan"
2) "12"
127.0.0.1:6379> hgetall student
1) "name"
2) "zhangsan"
3) "age"
4) "12"
5) "sex"
6) "boy"
7) "address"
8) "beijing"
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hincrby student age 1
(integer) 13
127.0.0.1:6379> hincrbyfloat student age 1.2
"14.2"
127.0.0.1:6379> hdel student age address
(integer) 2
127.0.0.1:6379> hvals student
1) "zhangsan"
2) "boy"
127.0.0.1:6379> hkeys student
1) "name"
2) "sex"
127.0.0.1:6379> hlen student
(integer) 2 3. 列表 List
列表类型(List)可以存储一个有序的字符串列表,常见的操作有向列表两端添加元素,或者获取列表的某一个片段。
其内部使用双向链表实现,所以向列表两端添加元素、取元素的时间复杂度为O(1),获取越接近两端的元素速度越快;使用链表的代价是通过索引访问元素比较慢,设想在IPhone发售当天有1000个人在排队,苹果公司打算给第486位顾客免费赠送一部,工作人员不得不一个一个数到第486个人。如果是新来的人想加入队伍,直接排到队尾就可以。
lpush student xiaoli xiaowang xiaoliu xiaozhang
rpush student zhangsan lisi wangwu
lpushx student xiaoming rpushx student maliu lpop student
rpop student
lindex student 0
linsert student before xiaozhang zhangsan
llen student
lrange student 0 4
lrem student 2 zhangsan
lset student 2 xiaolei
ltrim student 0 3
127.0.0.1:6379> lpush student xiaoli xiaowang xiaoliu xiaozhang
(integer) 4
127.0.0.1:6379> rpush student zhangsan lisi wangwu
(integer) 7
127.0.0.1:6379> lpushx student xiaoming
(integer) 8
127.0.0.1:6379> rpushx student maliu
(integer) 9
127.0.0.1:6379> lpop student
"xiaoming"
127.0.0.1:6379> rpop student
"maliu"
127.0.0.1:6379> lindex student 0
"xiaozhang"
127.0.0.1:6379> linsert student before xiaozhang zhangsan
(integer) 8
127.0.0.1:6379> llen student
(integer) 8
127.0.0.1:6379> lrange student 0 4
1) "zhangsan"
2) "xiaozhang"
3) "xiaoliu"
4) "xiaowang"
5) "xiaoli"
127.0.0.1:6379> lrem student 2 zhangsan
(integer) 2
127.0.0.1:6379> lset student 2 xiaolei
OK
127.0.0.1:6379> ltrim student 0 3
OK
127.0.0.1:6379> lrange student 0 3
1) "xiaozhang"
2) "xiaoliu"
3) "xiaolei"
4) "xiaoli"
4. 集合 Set
集合的概念高中数学中就已经学过,集合中的每一个元素都是不同的,且没有顺序。一个集合类型(Set)键可以存储至多2^32-1个字符串。
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是O(1)。最方便的是多个集合类型键之间还可以进行交集、并集和差集运算。
sadd student zhangsan lisi ,sadd monitor wangwu zhangsan
scard student
smembers student
srem student lisi
sismember student zhangsan
sinter student monitor sinterstore sinter student monitor
sunion student monitor
sunionstore sunion student monitor
sdiff monitor student
sdiffstore sdiff monitor student
srandmember sunion 2
spop sunion
smove monitor student wangwu
127.0.0.1:6379> sadd student zhangsan lisi
(integer) 2
127.0.0.1:6379> sadd monitor wangwu zhangsan
(integer) 2
127.0.0.1:6379> scard student
(integer) 2
127.0.0.1:6379> smembers student
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> srem student lisi
(integer) 1
127.0.0.1:6379> sismember student zhangsan
(integer) 1
127.0.0.1:6379> sinter student monitor
1) "zhangsan"
127.0.0.1:6379> sinterstore sinter student monitor
(integer) 1
127.0.0.1:6379> sunion student monitor
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> sunionstore sunion student monitor
(integer) 2
127.0.0.1:6379> sdiff monitor student
1) "wangwu"
127.0.0.1:6379> sdiffstore sdiff monitor student
(integer) 1
127.0.0.1:6379> srandmember sunion 2
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> spop sunion
"zhangsan"
127.0.0.1:6379> smove monitor student wangwu
(integer) 1
5. 有序集合 Sorted Set
有序集合与集合的区别在于“有序”二字,不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,而且还能有序的获取前N个元素。
有序集合类型在某些方面和列表类型有些相似。
但是二者有着很大的区别,这使得它们的应用场景也是不同的。
有序集合类型算得上是Redis的5种数据类型中最高级的类型了,在学习时可以与列表类型和集合类型对照理解。
zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu 更新分数 zadd score 100 zhangsan
zscore score zhangsan zrange score 0 -1 withscores zrevrange score 0 -1 withscores (;min和max还支持无穷大,-inf和+inf分别代表负无穷和正无穷。LIMIT offset count中,offset表示从第一个元素开始偏移的位数,count表示输出的数量。 如:zrangebyscore score 50 (80 limit 1 2 zrevrangebyscore score 80 50
zincrby score 5 lisi
zcard score
zcount score 50 100
zrem score wangwu
zremrangebyrank score 0 1
zremrangebyscore score 90 100
zrank score xiaoliu
zrevrank score xiaoliu 127.0.0.1:6379> zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu
(integer) 9
127.0.0.1:6379> zadd score 100 zhangsan
(integer) 0
127.0.0.1:6379> zscore score zhangsan
"100"
127.0.0.1:6379> zrange score 0 -1 withscores
1) "lisi"
2) "60"
3) "wangwu"
4) "70"
5) "zhaoliu"
6) "80"
7) "yangqi"
8) "90"
9) "zhangsan"
10) "100"
11) "xiaoming"
12) "120"
13) "xiaozhang"
14) "130"
15) "xiaoli"
16) "140"
17) "xiaoliu"
18) "150"
127.0.0.1:6379> zrevrange score 0 -1 withscores
1) "xiaoliu"
2) "150"
3) "xiaoli"
4) "140"
5) "xiaozhang"
6) "130"
7) "xiaoming"
8) "120"
9) "zhangsan"
10) "100"
11) "yangqi"
12) "90"
13) "zhaoliu"
14) "80"
15) "wangwu"
16) "70"
17) "lisi"
18) "60"
127.0.0.1:6379> zrangebyscore score 50 (80 limit 1 2
1) "wangwu"
127.0.0.1:6379> zrevrangebyscore score 80 50
1) "zhaoliu"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zincrby score 5 lisi
"65"
127.0.0.1:6379> zcard score
(integer) 9
127.0.0.1:6379> zcount score 50 100
(integer) 5
127.0.0.1:6379> zrem score wangwu
(integer) 1
127.0.0.1:6379> zremrangebyrank score 0 1
(integer) 2
127.0.0.1:6379> zremrangebyscore score 90 100
(integer) 2
127.0.0.1:6379> zrank score xiaoliu
(integer) 3
127.0.0.1:6379> zrevrank score xiaoliu
(integer) 0
文章除注明转载外,均为原创。欢迎任何形式的转载,但请务必注明出处:
文章转载自 慕课网
本文作者:dotleo
作者主页:http://www.imooc.com/u/2538812/articles
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1806/viewspace-2799412/ ,如需转载,请注明出处,否则将追究法律责任。