一.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.原子性的操作
incrby key num localhost:6379> incrby age 10 当value是整数的时候,对value加上指定数。原子性
decr key localhost:6379> decr age 当value是整数的时候,对value减去1 , 原子性的
decrby key num 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看到左边第一个元素被弹出了。
3.5从右边弹出一个元素
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
3.7 删除列表中指定的值
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的数据结构。
4.1向集合中添加元素
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 集合间的运算
4.5.1 求两个集合的差集 属于集合A不属于集合B
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}
4.5.2 求两个集合交集
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"