可用作数据库、缓存和消息中间件MQ
Redis-Key
ttl name查看当前key的剩余时间
查看当前key的类型
String(字符串)
90%的java程序员使用redis只会使用String类型!(避免)
127.0.0.1:6379> set key1 v1 #设置值
OK
127.0.0.1:6379> get key1 #获得值
"v1"
127.0.0.1:6379> keys * #获得所有的值
1) "key1"
127.0.0.1:6379> EXISTS key1 #判断某一个key是否存在
(integer) 1
127.0.0.1:6379> APPEND key1 "hello" #追加字符串,如果当前key不存在,就相当于setkey
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1 #获取字符串的长度
(integer) 7
127.0.0.1:6379> APPEND key1 ",kuangshen"
(integer) 17
127.0.0.1:6379> strlen key1
(integer) 17
127.0.0.1:6379> get key1
"v1hello,kuangshen"
127.0.0.1:6379>
#########################################################
#i++
#步长 i+=
127.0.0.1:6379> set views 0 #初始量为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> decr views
(integer) 0
127.0.0.1:6379> decr views
(integer) -1
127.0.0.1:6379> get views
"-1"
127.0.0.1:6379> INCRBY views 10 #可以设置步长,自动增长的量
(integer) 9
127.0.0.1:6379> INCRBY views 10
(integer) 19
127.0.0.1:6379> decrby views 5 #可以设置步长,自减的量
(integer) 14
127.0.0.1:6379>
##########################################################
#字符串范围range
127.0.0.1:6379> set key1 "hello,kuangshen" #设置key1的值
OK
127.0.0.1:6379> get key1
"hello,kuangshen"
127.0.0.1:6379> GETRANGE key1 0 3 #截取字符串[0,3]
"hell"
127.0.0.1:6379> GETRANGE key1 0 -1 #获取全部的字符串和get key是一样的
"hello,kuangshen"
#替换!
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx #替换指定位置开始的字符串!
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
###########################################################
# setex(set with expire) #设置过期时间
# setnx(set if not exist) #不存在设置(在分布式锁中会常常使用!)
127.0.0.1:6379> setex key3 30 "hello" #设置key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl
(error) ERR wrong number of arguments for 'ttl' command
127.0.0.1:6379> ttl key3
(integer) 17
127.0.0.1:6379> setnx mykey "redis" #如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "key2"
3) "key1"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "mongoDB" #如果mykey存在,创建失败!
(integer) 0
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379>
###########################################################
mset
mget
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
3) "k3"
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 #msetnx是一个原子性的操作,要么一起成功,么要一起失败!
(integer) 0
127.0.0.1:6379> get key4
(nil)
127.0.0.1:6379>
# 对象
set user:1 {name:zhangsan,age:3} #设置一个user:1对象 值为json字符串来保存一个对象!
#这里的key是一个巧妙地设计: user;{id}:{filed},如此设计在Redis中是完全可以的!
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "2"
###########################################################
getset #先get再set
127.0.0.1:6379> getset db redis #如果不存在值,返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongdb #如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongdb"
###########################################################
数据结构是相同的!
String类型的使用场景:value除了是我们的字符串还可以是我们的数字!
···计数器
···统计多单位的数量 uid:xxxxxx:follow 0 incr
···粉丝数
···对象缓存存储!
List
基本的数据类型,列表
在redis里面,可以吧list弄成,栈、队列、阻塞队列!
所有的list命令都是L开头的
redis不区分大小写
#############################################################
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 #获取list中的值
1) "three"
2) "two"
3) "one"
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"
##################################################################
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> LPOP list #移除list的第一个元素
"three"
127.0.0.1:6379> RPOP list #移除list的最后一个元素
"right"
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
2) "one"
####################################################################
Lindex
127.0.0.1:6379> lindex list 1 #通过下标获取list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
####################################################################
Llen
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> Llen list #返回列表的长度
(integer) 3
####################################################################
移除指定的值!
取关的操作 uid
Lrem
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one #移除list集合中指定个数的value,精准匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
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> lrem list 2 three
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "two"
####################################################################
trim 修剪:list 截断
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> Rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> Rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2 #通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello1"
2) "hello2"
####################################################################
rpoplpush #移除列表的最后一个元素,并移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist
"hello2"
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1
1) "hello2"
####################################################################
lset 将列表中指定下标的值替换成另外一个值,相当于更新操作
127.0.0.1:6379> lpush list value1
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "value1"
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> lset list 1 other #如果不存在列表会报错
(error) ERR index out of range
####################################################################
linsert #将某一个具体的value插入到列表中某个元素的前面或者后面
127.0.0.1:6379> Rpush mylist "hello"
(integer) 1
127.0.0.1:6379> Rpush mylist "world"
(integer) 2
127.0.0.1:6379> LINSERT mylist before "world" "other"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> LINSERT mylist after "world" "new"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"
小结:
- 他实际上是一个链表,before Node after, left ,right都可以插入值
~ 如果key不存在,创建新的链表
~ 如果key存在,新增内容
~ 如果移除了所有值,空链表,也代表不存在!
~ 在两边插入或者改动值,效率最高!中间元素,相对来说,效率会低一点
消息队列!消息队列 (Lpush Rpop) 栈 (Lpush Lpop)
set(集合)
set中的值是不能重读的!
####################################################################
127.0.0.1:6379> sadd myset "hello" #set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen"
(integer) 1
127.0.0.1:6379> SMEMBERS myset #查看指定set的所有值
1) "hello"
2) "kuangshen"
3) "lovekuangshen"
127.0.0.1:6379> SISMEMBER myset hello #判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> SISMEMBER myset world
(integer) 0
####################################################################
127.0.0.1:6379> scard myset #获取set集合中的内容元素个数!
(integer) 4
####################################################################
rem
127.0.0.1:6379> srem myset hello #移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "lovekuangshen2"
3) "lovekuangshen"
####################################################################
set 无序不重复集合:抽随机!
127.0.0.1:6379> SRANDMEMBER myset #随机抽选出一个元素
"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset
"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2 #随机抽选指定个数的元素
1) "lovekuangshen"
2) "lovekuangshen2"
####################################################################
删除指定的key,随机删除key!
127.0.0.1:6379> SMEMBERS myset
1) "kuangshen"
2) "lovekuangshen2"
3) "lovekuangshen"
127.0.0.1:6379> spop myset #随机删除一些set集合中的元素
"kuangshen"
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen2"
2) "lovekuangshen"
127.0.0.1:6379> spop myset
"lovekuangshen2"
127.0.0.1:6379> SMEMBERS myset
1) "lovekuangshen"
####################################################################
将一个指定的值,移动到另外一个set集合!
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen" #将一个指定的值,移动到另外一个set集合
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "kuangshen"
2) "set2"
127.0.0.1:6379>
####################################################################
微博,B站,共同关注!(并集)
数字集合类:
~ 差集
~ 交集
~ 并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> SDIFF key1 key2 #差集
1) "a"
2) "b"
127.0.0.1:6379> SINTER key1 key2 #交集 共同好友就可以这样实现
1) "c"
127.0.0.1:6379> SUNION key1 key2 #并集
1) "a"
2) "b"
3) "e"
4) "c"
5) "d"
微博,A用户将所有关注的人放在一个set集合中!将他的粉丝也放在一个集合中
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
Hash (哈希)
Map集合,key-Map集合!这时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的key-value!
set myhash field kuangshen
####################################################################
127.0.0.1:6379> hset myhash field kuangshen #set一个具体key-value
(integer) 1
127.0.0.1:6379> hget myhash field #获取一个字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field hello field2 world #set多个key-value
OK
127.0.0.1:6379> hmget myhash field field2 #获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash #获取全部的数据
1) "field"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field #删除hash指定key字段!对应的value也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
####################################################################
hlen
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> HGETALL myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash #获取hash表的字符数量
(integer) 2
####################################################################
127.0.0.1:6379> HEXISTS myhash field1 #判断hash中指定字段是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash field2
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3
(integer) 0
####################################################################
#只获得所有field
#只获得所有value
127.0.0.1:6379> hkeys myhash #只获得所有field
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash #只获得所有value
1) "world"
2) "hello"
####################################################################
incr decr
127.0.0.1:6379> hset myhash field3 5 #指定增量
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello #如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 hello #如果存在则不可以设置
(integer) 0
hash变更的数据user name age 尤其是用户信息之类的,经常变动的信息!
hash更适合于对象的存储!String更加适合字符串存储!
Zset(有序集合)
在set的基础上,增加了一个值, set k1 v1 zset k1 score1 v1
127.0.0.1:6379> zadd myset 1 one #添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1
1) "one"
2) "two"
3) "three"
####################################################################
127.0.0.1:6379> zadd salary 2500 xiaohong #添加三个用户,薪水
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 kuangshen
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf #按照从小到大排序显示
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> ZREVRANGE salary 0 -1 #按照从大到小进行排序
1) "zhangsan"
2) "kuangshen"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores #按照从小到大排序显示,并且附带成绩
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan"
6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores #显示工资小于2500员工的升序排列!
1) "kuangshen"
2) "500"
3) "xiaohong"
4) "2500"
#####################################################################
#移除rem中的元素
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "xiaohong"
3) "zhangsan"
127.0.0.1:6379> zrem salary xiaohong #移除小红
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1
1) "kuangshen"
2) "zhangsan"
127.0.0.1:6379> ZCARD salary #获取有序集合中的个数
(integer) 2
#####################################################################
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 kuangshen
(integer) 2
127.0.0.1:6379> zcount myset 1 3 #获取指定区间的成员数量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
#####################################################################
其余的一些API,通过学习,剩下的如果工作中有需要,这个时候可以去查看官方文档。
案例思路:set 排序 存储班级成绩表,工资表排序!
普通消息,1,重要消息2,带权重进行判断!
排行榜应用实现,取Top N测试!