五大数据类型
官方介绍
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String类型
String类型的使用场景:value除了是我们的字符串还可以是数字
计数器
统计统计单位的数量
粉丝数
对象缓存存储
List
基本数据类型,列表 list可以实现栈、队列、阻塞队列
所有的list命令都是以L开头的
常用list命令
#将一个值或多个值,插入到列表头部(左边)
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
#通过区间获取值
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
#将一个值或多个值,插入到列表尾部(右边)
127.0.0.1:6379> rpush list right
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
#移除第一个元素(左边第一个)
127.0.0.1:6379> lpop list
"three"
#移除最后一个元素(右边第一个)
127.0.0.1:6379> rpop list
"right"
#通过下标获取list中某一个值
127.0.0.1:6379> lindex list 1
"one"
//返回列表的长度
127.0.0.1:6379> Llen list
(integer) 3
//移除指定的值uid,当有相同的value时,可以用count来规定移除几个(从左到右选择)
//count>0从前往后移除,=0移除全部,<0从后往前
127.0.0.1:6379> lrem key count value
//截取list,截取下标在中间的包括边界,数据被修改了,只剩下截取的数据
127.0.0.1:6379> ltrim list 1 2
OK
//将列表的最右边一个值移动到另一个列表的最左边
127.0.0.1:6379> rpoplpush list list2
"lk3"
127.0.0.1:6379> lrange list2 0 -1
1) "lk3"
127.0.0.1:6379> lrange list 0 -1
1) "lk2"
//lset更新指定位置的值,若值不存在则报错
127.0.0.1:6379> lpush list lkyy1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "lkyy1"
127.0.0.1:6379> lset list 0 item
OK
127.0.0.1:6379> lrange list 0 0
1) "item"
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
//linsert list before|after 具体值 插入值
127.0.0.1:6379> linsert list before "world" "other"
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "other"
3) "world"
小结:
实际上是一个链表,left ,right都可以插入值
如果key不存在,创建新的链表
如果key存在,新增内容
如果key存在,新增内容如果移除了所有值,空链表,也代表不存在
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
通过相应的命令可以实现其他数据结构的特性
队列(LPUSH RPOP) 栈(LPUSH LPOP)
Set(集合)
无序不重复集合
//添加元素
127.0.0.1:6379> sadd myset one two three
(integer) 3
//查看所有值
127.0.0.1:6379> smembers myset
1) "two"
2) "one"
3) "three"
//查询是否存在某值
127.0.0.1:6379> sismember myset one
(integer) 1
//获取set中个数
127.0.0.1:6379> scard myset
(integer) 3
//移除set中的指定元素
127.0.0.1:6379> srem myset one
(integer) 1
//随机获取set中的元素,[count]表示获取的个数
127.0.0.1:6379> srandmember myset [count]
"two"
//随机移除一个元素,[count]表示移除的个数
127.0.0.1:6379> spop myset [count]
"two"
//将一个指定的值移动到另一个set集合
127.0.0.1:6379> smove myset myset2 "one"
(integer) 1
//第一个集合中有第二个集合中没有的元素
127.0.0.1:6379> sadd myset a b c d e
(integer) 5
127.0.0.1:6379> sadd myset2 c d e f g
(integer) 5
127.0.0.1:6379> sdiff myset myset2
1) "a"
2) "b"
//都有的元素,交集
127.0.0.1:6379> sinter myset myset2
1) "c"
2) "e"
3) "d"
//所有元素,并集
127.0.0.1:6379> sunion myset myset2
1) "c"
2) "b"
3) "f"
4) "e"
5) "a"
6) "d"
7) "g"
Hash(哈希)
Map集合,key-map,这时候这个值是一个map集合,本质和String类型没有太大区别,还是一个简单的key-value
//
127.0.0.1:6379> hset key f1 lkyyy
//获取单个值
127.0.0.1:6379> hget myhash f1
"lkyyy"
//添加多个值
127.0.0.1:6379> hmset myhash f1 hello f2 world
OK
///获取多个值
127.0.0.1:6379> hmget myhash f1 f2
1) "hello"
2) "world"
//获取全部数据
127.0.0.1:6379> hgetall myhash
1) "f1"
2) "hello"
3) "f2"
4) "world"
//删除指定key字段,对应value也被删除
127.0.0.1:6379> hdel myhash f1
(integer) 1
//获取hash表的字段数量
127.0.0.1:6379> hlen myhash
(integer) 1
127.0.0.1:6379> hmset myhash f1 v1 f2 v2 f3 v3
OK
//判断hash中是否存在指定key
127.0.0.1:6379> hexists myhash f1
(integer) 1
//只获得filed
127.0.0.1:6379> hkeys myhash
1) "f1"
2) "f2"
3) "f3"
//只获得value
127.0.0.1:6379> hvals myhash
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> hincrby key field increment
//不存在则可以设置
127.0.0.1:6379> hsetnx key field value
Zset(有序集合)
在set基础上,增加了一个值
127.0.0.1:6379> zadd salary 100 xiaoming
(integer) 1
127.0.0.1:6379> zadd salary 200 xiaobai
(integer) 1
127.0.0.1:6379> zadd salary 300 xiaohei
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "xiaoming"
2) "xiaobai"
3) "xiaohei"
//[min max] 默认为闭区间,设置开区间加‘(’,从小到大
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores //升序
1) "xiaobai"
2) "200"
3) "xiaohei"
4) "300"
//从大到小排序
127.0.0.1:6379> zrevrange salary 0 -1 withscores
1) "xiaohei"
2) "300"
3) "xiaobai"
4) "200"
//移除一个指定元素
127.0.0.1:6379> zrem salary xiaoming
(integer) 1
//获取有序集合中的个数
127.0.0.1:6379> zcard salary
(integer) 2
127.0.0.1:6379> Zadd myset 1 hello 2 world 3 qq
(integer) 3
//获取区间的成员数
127.0.0.1:6379> zcount myset 1 2
(integer) 2