一.Redis数据类型
Redis支持5中数据类型,分别是字符串(Strings),列表(Lists),集合(Sets),哈希(Hashes),有序集合(Sorted Sets)下面会分别介绍各个数据类型以及在redis客户端下相关命令。
二.字符串(Strings)
字符串类型是Redis中最基本的数据类型,能存储任何形式的字符串,包括二进制数据。可以使用字符串来存储json化的对象,持久化的对象,二进制流表示的图片等等。3.0之前字符串类型最大容量是512MB。这足够使用了。
2.1 命令
set key value localhost:6379> set name Tom 保存一个key为name,value为 Tom的键值对。
get key localhost:6379> get name 读取key为name的值
keys * localhost:6379> keys * 返回所有的key
incr key localhost:6379> incr age 当value是整数的时候可以使用这个命令对整数+1.原子性的操作
当value是整数的时候,对value加上指定数。原子性
当value是整数的时候,对value减去1 , 原子性的
localhost:6379> decrby age 10 当value是整数的时候,对value减去指定数,原子性
incrbyfloat key float localhost:6379> incrbyfloat price 0.9 当value是浮点数的时候,对value增加指定浮点数数,原子性
decrbyfloat key float localhost:6379> decrbyfloat price 0.9 当value是浮点数的时候,对value减去指定浮点数数,原子性
append key value localhost:6379> append name Jack 把value追加到相应key的value后面
localhost:6379> mset city ShangHai nation China 同时设置多个key-value
OK
localhost:6379> mget city nation 同时获取多个key-value
1) "ShangHai"
2) "China"
二.散列类型(Hashes) 当我们存一个对象的时候一般是把这个对象进行序列化,然后存在redis中,在需要对象里面某个字段的时候,从redis中读取对象序列化的value,对这个对象进行反序列化,再获得我们需要的某个字段,这造成很大的浪费。如果想要读取那个字段就可以直接读取某个字段多好。关系型数据库就是这样做的,但是对于某一些对象我有某些字段,某些对象我没有某些字段,这样关系型数据库就做不到了。在散列类型中一个key最多有2^32-1个字段。
Redis的散列类型就能做到。一个key对于多个filed,一个filed对于一个value。
localhost:6379> hset student:001 name Tom
(integer) 1
localhost:6379> hset student:001 age 25
(integer) 1
localhost:6379> hset student:001 city ShangHai
(integer) 1
localhost:6379> hget student:001 name
"Tom"
localhost:6379> hget student:001 age
"25"
localhost:6379> hget student:001 city
"ShangHai"
key为student:001的学生有三个字段,分别是name = Tom , age = 25,city = ShangHai
在这里需要注意一个事情,就是使用hset的时候,如果字段以及存在了,则会更新数据,然后返回0,如果字段不存在,则会新建字段插入数据,然后返回1。
当然我们也可以批量添加和查询操作
localhost:6379> hmset student:002 name Jck age 25 city BeiJing
OK
localhost:6379> hmget student:002 name age city
1) "Jck"
2) "25"
3) "BeiJing"
或者
localhost:6379> hgetall student:002
1) "name"
2) "Jck"
3) "age"
4) "25"
5) "city"
6) "BeiJing"
或者 获取某个key的所有字段的值
localhost:6379> hvals student:001
1) "123"
2) "35"
3) "ShangHai"
4) "80kg"
增加数字
localhost:6379> hincrby student:001 age 10
(integer) 35
当字段不存在时,会自动创建字段,并赋值。
获取字段数量
localhost:6379> hlen student:002
(integer) 3
删除字段
localhost:6379> hdel student:001 ages
(integer) 1
三.列表类型(Lists)
列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获取列表中某一段的值。列表类型在Redis中是使用的双向链表实现的。查询头尾比较近的元素相当快,但是通过索引去访问元素就比较慢了。这种特性是的Redis适合用来做关心最新数据的一些功能,如微博上新鲜事,新闻中今日新闻,热点新闻。也适合记录日志,因为添加日志不会受到已有的日志数量的影响。借助列表类型,Redis可以作为队列或者栈来使用。一个列表类型最多容纳2^32-1个元素。
3.1往列表里面添加,从左边插入
localhost:6379> lpush numbers 5 4 3 2 1
(integer) 5
现在数列里面顺序从左到右是 1 2 3 4 5
3.2往列表里面添加,从右边插入
localhost:6379> rpush numbers 5 4 3 2 1
(integer) 10
现在数列里面顺序从左到右是 1 2 3 4 5 5 4 3 2 1
3.3查看数列值
localhost:6379> lrange numbers 0 10
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "5"
7) "4"
8) "3"
9) "2"
10) "1"
localhost:6379> lrange numbers 0 0
1) "1"
在redis里面下标从0 开始,lrange numbers 0 10 是指从下标为0的开始到下标为10的元素。 lrange numbers 0 0 查下标为0的元素开始到下标为0的元素结束,也就是左边第一个元素。负数代表从右边第几个开始,-1表示右边第一个,-2表示右边第二个。 lrange numbers 0 -1表示显示整个数列
3.4从左边弹出一个元素
localhost:6379> lpop numbers
"1"
localhost:6379> lrange numbers 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
可以通过lrange看到左边第一个元素被弹出了。
localhost:6379> rpop numbers
"1"
localhost:6379> lrange numbers 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "5"
6) "4"
7) "3"
8) "2"
可以看到右边第一个元素被弹出了。
3.6获取列表中元素的个数
localhost:6379> llen numbers
(integer) 8
localhost:6379> lrem numbers 1 2
(integer) 1
删除从列表删除前1一个值为2的元素
lrem numbers count value
count>0 : 从左边开始删除count个值为value的元素。
count <0 : 从右边开始删除count个值为value的元素。
count = 0 : 删除所有值为value的元素
3.8 根据下标位置获取元素
localhost:6379> lindex numbers 0
"4"
localhost:6379> lindex numbers 1
"5"
localhost:6379> lindex numbers -1
"4"
3.9 修改元素的值
localhost:6379> lset numbers 0 10
OK
localhost:6379> lindex numbers 0
"10"
3.10 只保留某个范围的元素
localhost:6379> lrange numbers 0 -1
1) "10"
2) "5"
3) "5"
4) "4"
localhost:6379> ltrim numbers 1 2
OK
localhost:6379> lrange numbers 0 -1
1) "5"
2) "5"
3.8 队列和栈的实现
聪明的你一定想到了
lpush配合rpop(或者rpush配合lpop)就实现先入先出的一个队列了。
lpush配合lpop(或者rpush配合rpop) 就实现后进先出的一个栈了。
四.集合类型(Set)
集合里面没有顺序,每个元素都不同,与java中set有点类似。Redis中集合类型可以存储最好2^32-1个元素。Redis中集合类型使用hash table 实现的,就类似java中的HahsMap的数据结构。
localhost:6379> sadd letters a b c d
(integer) 4
4.2查询集合中所有元素
localhost:6379> smembers letters
1) "b"
2) "a"
3) "c"
4) "d"
4.3 从集合中删除元素
localhost:6379> srem letters b a
(integer) 2
localhost:6379> smembers letters
1) "c"
2) "d"
4.4 查询集合中是否存在
localhost:6379> sismember letters c
(integer) 1
4.5 集合间的运算
localhost:6379> sadd seta a b c d
(integer) 4
localhost:6379> sadd setb c d
(integer) 2
localhost:6379> sdiff seta setb
1) "b"
2) "a"
{a,b,c,d} -{c,d} = {a.b}
localhost:6379> sinter seta setb
1) "c"
2) "d"
{a,b,c,d} ∩{c,d} = {c,d}
4.5.3 求两个集合的并集
localhost:6379> sunion seta setb
1) "a"
2) "c"
3) "d"
4) "b"
4.6获得集合中元素个数
localhost:6379> scard seta
(integer) 4
五.有序集合(Sorted Set)
很显然就是一个集合,但是元素是有序的。
5.1 向有序集合中添加
localhost:6379> zadd scoreset 80 Tom 90 Jack 40 Devil
(integer) 3
如果元素已经存在则修改元素的值
5.2 查询某个元素的值
localhost:6379> zscore scoreset Jack
"90"
5.3 根据下标位置查询
localhost:6379> zrange scoreset 0 -1
1) "Devil"
2) "Tom"
3) "Jack"
localhost:6379> zrange scoreset 0 -1 withscores
1) "Devil"
2) "40"
3) "Tom"
4) "80.5"
5) "Jack"
6) "90"
5.4 获取指定分数范围的元素
localhost:6379> zrange scoreset 0 -1 withscores
1) "Devil"
2) "40"
3) "Tom"
4) "80.5"
5) "Jack"
6) "90"