1、官方的介绍
2、基本命令
set name dxz#设置键值对name=dxz
get name #得到name所对应的值
exists name#查看name是否存在
move name 1#移除name属性
key * #查看所有的key
expire name 10 #设置name键值对有效期为10s
ttl name #查看name键值对的有效时间
3、String(字符串)
-
90%的程序员只会使用redis的String类型
-
127.0.0.1:6379> set name v1 OK 127.0.0.1:6379> append name 'hello'#拼接字符串,如果不存在该字符串则新建一个。 (integer) 7 127.0.0.1:6379> string name (error) ERR unknown command `string`, with args beginning with: `name`, 127.0.0.1:6379> strlen name (integer) 7 127.0.0.1:6379>
-
################################## #数据增加或者减小 127.0.0.1:6379> set views 0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views#自增1 (integer) 1 127.0.0.1:6379> incr views (integer) 2 127.0.0.1:6379> get views "2" 127.0.0.1:6379> decr views#自减1 (integer) 1 127.0.0.1:6379> incrby views 10#自增10 (integer) 11 127.0.0.1:6379> decrby views 5#自减5 (integer) 6 ################################### #字符串范围range 127.0.0.1:6379> set key1 "hello" OK 127.0.0.1:6379> get key1 "hello" 127.0.0.1:6379> GETRANGE key1 0 3 "hell" 127.0.0.1:6379> GETRANGE key1 0 -1 "hello" 127.0.0.1:6379> #替换! 127.0.0.1:6379> set key2 abcde OK 127.0.0.1:6379> get key2 "abcde" 127.0.0.1:6379> SETRANGE key2 1 xx (integer) 5 127.0.0.1:6379> get key2 "axxde" ################################## # setex(set with expire) 设置过期时间 # setnx(set if not exsit) 不存在再设置(在分布式锁中经常使用) 127.0.0.1:6379> setex key3 30 "hello" #设置key3有30秒有效期 OK 127.0.0.1:6379> ttl key3 (integer) 26 127.0.0.1:6379> ttl key3 (integer) 21 127.0.0.1:6379> setnx key4 "redis" #如果当前的key不存在则新建 (integer) 1 127.0.0.1:6379> setnx key4 "MongoDB" #如果已经存在则不起作用 (integer) 0 127.0.0.1:6379> get key4 "redis" ################################# #同时设置多样值 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> keys * 1) "k1" 2) "k3" 3) "k2" 127.0.0.1:6379> mget k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 #这个操作为一个原子性的操作,要成功一起成功,否则一起不成功 (integer) 0 127.0.0.1:6379> get key4 (nil) #对象 127.0.0.1:6379> set user:1 {name:xiaoduan,age3} OK #这是一种巧妙地设设计 127.0.0.1:6379> mset user:2:name xiaoyan user:2:age 3 OK 127.0.0.1:6379> mget user:2:name user:2:age 1) "xiaoyan" 2) "3" 127.0.0.1:6379> ################################ #getset先get后set 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> getset k1 v1 (nil) 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> getset k1 mongodb "v1" 127.0.0.1:6379> get k1 "mongodb" 127.0.0.1:6379>
数据结构是相通的。
String类似的使用场景,value除了使我们的字符串还可以是数字
- 计数器
- 统计数量(多单位)
- 粉丝数
- 对象缓存存储!
4、List
-
基本数据类型,列表
-
所有的List都是以L开头的,
-
127.0.0.1:6379> flushdb#清空数据 OK 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" 3) "one" 127.0.0.1:6379> rpush list four#右边存储数据 (integer) 4 127.0.0.1:6379> lrange list 0 -1 1) "three" 2) "two" 3) "one" 4) "four" ############################## 127.0.0.1:6379> lpop list#左边弹出一个值 "three" 127.0.0.1:6379> rpop list#右边弹出一个值 "four" 127.0.0.1:6379> ############################## 127.0.0.1:6379> lindex list 0#查看0对应的字段 "two" 127.0.0.1:6379> lindex list 1#查看1对应的字段 "one" 127.0.0.1:6379> llen list#查看List的长度 (integer) 2 ############################# #移除指定的值 Lrem 127.0.0.1:6379> lrem list 1 one #移除list中的One元素 (integer) 1 ############################ trim修剪:list截断 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> lpush mylist "hello1" (integer) 1 127.0.0.1:6379> lpush mylist "hello11" (integer) 2 127.0.0.1:6379> lpush mylist "hello12" (integer) 3 127.0.0.1:6379> ltrim mylist 1 2 #通过下表截取指定的长度,这个list已经改变了,阶段了只剩下截取的元素 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "hello11" ############################## #rpoplpush移除列表中最后一个元素,并将它放入新的列表 127.0.0.1:6379> lrange mylist 0 -1 1) "hello11" 2) "hello1" 127.0.0.1:6379> rpoplpush mylist newlist #将mylist中的最后一个元素移除,并且将它移动到newlist中 "hello1" 127.0.0.1:6379> lrange mylist 0 -1 # 查看mylist中的所有的元素 1) "hello11" 127.0.0.1:6379> lrange newlist 0 -1 # 查看newlist中的所有的元素 1) "hello1" ############################## lset将列表中指定下标的值替换为指定的值 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> exists list #判断是否存在list (integer) 0 127.0.0.1:6379> lset list 0 item #设置list第0个坐标的值 (error) ERR no such key #显示没有当前的list 127.0.0.1:6379> lpush list value1 #创建list并且push一个照顾值 (integer) 1 127.0.0.1:6379> lset list 0 item #将list中第0个元素改为item OK 127.0.0.1:6379> lrange list 0 0 # 查看当前list中的元素 1) "item" 127.0.0.1:6379> lset list 1 other #设置list中的1号元素,但是1号元素并不存在,所以报错 (error) ERR index out of range ############################## #linsert 将某一个具体的值插入到具体的位置 (error) ERR wrong number of arguments for 'lrange' command 127.0.0.1:6379> lrange list 0 -1 1) "item" 127.0.0.1:6379> linsert list after item after (integer) 2 127.0.0.1:6379> linsert list before item before (integer) 3 127.0.0.1:6379> lrange list 0 -1 1) "before" 2) "item" 3) "after"
-
小结
- 他实际就是一个链表,before node after,left,right都可以插入
- 如果key不存在,创建新的链表】
- 如果key存在,新增内容
- 如果移除了所有的值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!中间元素,相对来说效率底一点
- 消息队列!消息队列
5、Set(集合)
-
set中的值不能重复
-
############################# 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> sadd set hello #set集合中添加元素 (integer) 1 127.0.0.1:6379> sadd set xiaoduan # (integer) 1 127.0.0.1:6379> smembers set #查看set中的所有的元素 1) "xiaoduan" 2) "hello" 127.0.0.1:6379> SISMEMBER set hello # 查看hello是否为set中的元素 (integer) 1 127.0.0.1:6379> SISMEMBER set hello1 (integer) 0 ############################# 127.0.0.1:6379> scard set #查看set中的元素有几个 (integer) 2 127.0.0.1:6379> srem set hello #移除set中的hello元素 (integer) 1 127.0.0.1:6379> scard set (integer) 1 127.0.0.1:6379> smembers set 1) "xiaoduan" 127.0.0.1:6379> ############################# #set是一个无序不重复的,随机抽取 #srandmember 127.0.0.1:6379> sadd set xaioyan (integer) 1 127.0.0.1:6379> sadd set xiaoyan (integer) 1 127.0.0.1:6379> sadd laosi (error) ERR wrong number of arguments for 'sadd' command 127.0.0.1:6379> sadd set laosi (integer) 1 127.0.0.1:6379> srandmember set #随机抽取一个元素 "xiaoduan" 127.0.0.1:6379> srandmember set "laosi" 127.0.0.1:6379> srandmember set 2 #随机查询n个元素 1) "laosi" 2) "xiaoyan" ############################## #删除指定的key,随机删除key 127.0.0.1:6379> smembers set 1) "xaioyan" 2) "laosi" 3) "xiaoduan" 4) "xiaoyan" 127.0.0.1:6379> spop set #随机删除元素 "xiaoduan" 127.0.0.1:6379> spop set "xiaoyan" 127.0.0.1:6379> smembers set 1) "xaioyan" 2) "laosi" ############################## #将指定的一个元素移动到另外一个集合中 127.0.0.1:6379> smembers set 1) "xaioyan" 2) "laosi" 127.0.0.1:6379> sadd set2 myset (integer) 1 127.0.0.1:6379> smove set set2 xaioyan #移动 (integer) 1 127.0.0.1:6379> smembers set2 1) "xaioyan" 2) "myset" ############################## #查看并集和差集 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> sadd set1 a (integer) 1 127.0.0.1:6379> sadd set1 b (integer) 1 127.0.0.1:6379> sadd set1 c (integer) 1 127.0.0.1:6379> sadd set2 c (integer) 1 127.0.0.1:6379> sadd set2 d (integer) 1 127.0.0.1:6379> sadd set2 e (integer) 1 127.0.0.1:6379> sdiff set1 set2 #查看set1中不包含set2的元素 1) "a" 2) "b" 127.0.0.1:6379> sinter set1 set2 #查看set1和set2相同的元素 1) "c" 127.0.0.1:6379> sunion set1 set2 #查看set1和set2的并集 1) "a" 2) "b" 3) "c" 4) "d" #微博,A用户将所有的关注set集合中,将它的粉丝放在一个集合 #共同关注,二度好友
6、Hash(哈希)
-
map集合,key-Map集合!这时候这个值是一个map集合,本质与String没有太大的区别,还是一个简单的key-value
-
set myhash field
-
############################ 127.0.0.1:6379> hset hash field1 xiaoduan #设置一个hash值 (integer) 1 127.0.0.1:6379> hget hash field1 #获取一个字段值 "xiaoduan" 127.0.0.1:6379> hmset hash field1 hello field2 world #批量设置hash map OK 127.0.0.1:6379> hmget hash field1 field2 #批量得到hash中的字段值 1) "hello" 2) "world" 127.0.0.1:6379> hgetall hash #获取hash中的所有值 1) "field1" 2) "hello" 3) "field2" 4) "world" 127.0.0.1:6379> ############################## #hlen获取hash中的长度 127.0.0.1:6379> hlen hash (integer) 2 ############################## #获取hash中的所有字段 127.0.0.1:6379> hkeys hash 1) "field1" 2) "field2" #获取hash中的所有值 127.0.0.1:6379> hvals hash 1) "hello" 2) "world" ############################## #自增和自减 #incr decr 127.0.0.1:6379> hset hash field1 6 #设置hash中的field1 字段值为6 (integer) 1 127.0.0.1:6379> hincrby hash field1 1 #将hash中的field1字段值自增1 (integer) 7 127.0.0.1:6379> hincrby hash field1 -1 (integer) 6 127.0.0.1:6379> hsetnx hash field2 hello #如果不存在field2就创建字段,否则不创建 (integer) 1 127.0.0.1:6379> hsetnx hash field2 world (integer) 0 ############################# #hash变更的数据user name gae,尤其是用户信息之类的,经常变动的信息!hash更适合于对象的存储,String更加社和字段串存储!!
7、Zset(有序集合)
-
在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1
-
############################## 127.0.0.1:6379> zadd set 1 one (integer) 1 127.0.0.1:6379> zadd set 2 two 3 three (integer) 2 127.0.0.1:6379> zrange set 0 -1 1) "one" 2) "two" 3) "three" ############################## #查找到该zset中的所有元素,并将它使用score进行排序,并且附带成绩,默认从小到大 127.0.0.1:6379> zrangebyscore set -inf +inf withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" #进行从小到大进行排序 127.0.0.1:6379> zrevrange set 0 -1 1) "three" 2) "two" 3) "one" #显示小于等于2的员工 127.0.0.1:6379> zrangebyscore set -inf 2 withscores 1) "one" 2) "1" 3) "two" 4) "2" #获取集合中的数据个数 127.0.0.1:6379> zcard set (integer) 3 #获取指定区间的成员数量 127.0.0.1:6379> zcount set 1 2 (integer) 2 127.0.0.1:6379> zcount set 1 3 (integer) 3
其余的很多API,可以去查找官方文档!
案例思路:set排序,存储班级成绩表,工资表排序