阅读如下内容时,手边打开一个redis-cli一块儿输入,输入命令敲击回车键前在心中想好你的答案,若是结果不合你的预期,请分析缘由,使极大地提升学习效率。若是没有条件,每一个数据类型后有代码运行结果,供你参考。java
Reids做为一个key-value型存储系统,下面咱们就分别从key和value提及:redis
key数据库
key支持非二进制安全的字符类型(not binary-safe strings)。它不支持空格和换行等,key的命名通常建议使用object-type:id:field
,即对象类型 :对象ID:对象属性方式。安全
对于key的命名,不要太长,占内存,致使查询慢;不要过短,显然car:1:color比c:1:c的可读性高太多app
key的相关操做:dom
keys *
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. 字符串 Stringscode
字符串类型是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