基本操作命令
127.0.0.1:6379> set name fx #设置key值
OK
127.0.0.1:6379> get name #获取key值
"fx"
127.0.0.1:6379> select 1 #切换数据库 (redis默认有16个数据库,默认是第0个)
OK
127.0.0.1:6379[1]> dbsize # 查看db数据库大小
(integer) 0
127.0.0.1:6379[1]> set name zfx
OK
127.0.0.1:6379[1]> dbsize
(integer) 1
127.0.0.1:6379[1]> keys * #查看数据库所有的key
1) "name"
127.0.0.1:6379[1]> flushdb #清空当前库
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> set name zfx
OK
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> flushall #清空所有库的内容
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]>
127.0.0.1:6379> set name fx
OK
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> keys *·
1) "name"
127.0.0.1:6379> get name
"fanlan"
127.0.0.1:6379> exists name # 判断当前的key是否存在
(integer) 1
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> del name #删除指定索引的值
(integer) 1
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> move name 1 # 移除当前的key
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> expire name 5 # 设置key的过期时间,单位是秒
(integer) 1
127.0.0.1:6379> ttl name #查看过期时间还剩多少秒!!!!
(integer) -2
127.0.0.1:6379> get name #过期后获取不到(nil)
(nil)
127.0.0.1:6379> set name fanlan
OK
127.0.0.1:6379> type name # 查看当前key的一个类型!
string
127.0.0.1:6379>
String(字符串)
127.0.0.1:6379> keys * #查看所有的key
1) "name"
127.0.0.1:6379> get name
"fanlan"
127.0.0.1:6379> append name fx # 追加字符串
(integer) 8
127.0.0.1:6379> get name
"fanlanfx"
127.0.0.1:6379> strlen name #获取字符串长度
(integer) 8
127.0.0.1:6379> append key fanlan # 追加字符串,如果当前key不存在,就相当于setkey
(integer) 6
127.0.0.1:6379> get key
"fanlan"
127.0.0.1:6379> set woshifanlan 0 # 初始浏览量为0
OK
127.0.0.1:6379> get woshifanlan
"0"
127.0.0.1:6379> incr woshifanlan #自增+1
(integer) 1
127.0.0.1:6379> incr woshifanlan #自增+1
(integer) 2
127.0.0.1:6379> decr woshifanlan #自减-1
(integer) 1
127.0.0.1:6379> decr woshifanlan #自减-1
(integer) 0
127.0.0.1:6379> incrby woshifanlan 5 #设置步长i+=5,指定增量
(integer) 5
127.0.0.1:6379> incr woshifanlan
(integer) 6
127.0.0.1:6379> incr woshifanlan
(integer) 7
# 字符串范围 range
127.0.0.1:6379> set name woshifanlan # 设置 name 的值
OK
127.0.0.1:6379> setrange name 0 4 # 替换指定索引位置的字符串
(integer) 11
127.0.0.1:6379> getrange name 0 4 #截取字符串name[0,4]
"4oshi"
127.0.0.1:6379> get name
"4oshifanlan"
127.0.0.1:6379> setrange name 0 w
(integer) 11
127.0.0.1:6379> get name
"woshifanlan"
127.0.0.1:6379> getrange name 5 10 #截取字符串name[5,10],
"fanlan"
127.0.0.1:6379> getrange name 0 -1 #获取全部的字符串 和 get key 含义一样
"woshifanlan"
# setex (set with expire) # 设置过期时间
# setnx (set if not exist) # 不存在在设置 (在分布式锁中会常常使用!)
127.0.0.1:6379> setex name 30 woshifanlan #设置key值过期时间,30秒后过期
OK
127.0.0.1:6379> ttl name #查看过期时间还剩多少秒!!!!
(integer) 23
127.0.0.1:6379> setnx key fanlan #设置key,不存在创建,存在,创建失败
(integer) 1
127.0.0.1:6379> get key
"fanlan"
127.0.0.1:6379> setnx key fanlan # 如果key存在,创建失败!
(integer) 0
127.0.0.1:6379> get key
"fanlan"
127.0.0.1:6379> keys * #查看数据库当中所有key
1) "key"
mset #同时设置多个值
mget #同时获取多个值
127.0.0.1:6379> mset name fanlan name1 woshifanlan # 同时设置多个值
OK
127.0.0.1:6379> mget name name1 # 同时获取多个值
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> msetnx name fanlan name1 woshifanlan # msetnx 是一个原子性的操作,要么一起成功,要么一起失败
(integer) 1
127.0.0.1:6379> set fx:1 {name:fanlan,age:21} # 设置一个user:1 对象 值为 json字符来保存一个对象!
# 这里的key是一个巧妙的设计: user:{id}:{filed} , 如此设计在Redis中是完全OK了!
OK
127.0.0.1:6379> get fx:1
"{name:fanlan,age:21}"
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"
# 先get然后在set
127.0.0.1:6379> getset name fanlan #如果key 不存在,返回nil
(nil)
127.0.0.1:6379> getset name woshifanlan #如果key存在,获取原来的值,并设置新值
"fanlan"
127.0.0.1:6379> get name #获取新值
"woshifanlan"
127.0.0.1:6379>
数据结构是相同的!
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!
1.计数器
2.统计多单位的数量
3.粉丝数
4.对象缓存存储
List(列表)
在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列!
所有的list命令都是用l开头的,Redis不区分大小命令
127.0.0.1:6379> lpush name fanlan # 将一个值或者多个值,插入到列表头部 (左)
(integer) 1
127.0.0.1:6379> lpush name woshifanlan
(integer) 2
127.0.0.1:6379> lpush name fx
(integer) 3
127.0.0.1:6379> lrange name 0 2 #通过区间获取list列表中值
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> lrange name 0 -1 #通过区间获取list列表中所有值
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> rpush name zfx #将一个值或者多个值,插入到列表右边
(integer) 4
127.0.0.1:6379> lrange name 0 -1 #通过区间获取list列表中所有值
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379>
LPOP #移除list列表左边值
RPOP #移除list列表右边值
127.0.0.1:6379> lrange name 0 -1
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379> lpop name #移除list列表左边值
"fx"
127.0.0.1:6379> rpop name #移除list列表右边值
"zfx"
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379>
Lindex #通过下标获取list值
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> lindex name 0 #通过下标(0)获取list值
"woshifanlan"
127.0.0.1:6379> lindex name 1 #通过下标(1)获取list值
"fanlan"
127.0.0.1:6379>
llen #获取list列表的长度
127.0.0.1:6379> lrange name 0 -1
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> llen name #获取list列表的长度
(integer) 2
127.0.0.1:6379>
lrem #移除list列表中值
127.0.0.1:6379> lpush key one
(integer) 1
127.0.0.1:6379> lpush key two
(integer) 2
127.0.0.1:6379> lpush key three
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrem key 1 one
(integer) 1
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush key one
(integer) 3
127.0.0.1:6379> rpush key one
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "one"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem key 2 one #移除list列表中的值[可选移除相同的值]
(integer) 2
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
ltrim #截取list列表中的值
127.0.0.1:6379> ltrim key 0 1 #截取list列表中的值,截掉指定范围,剩余列表中的值
OK
127.0.0.1:6379> lrange key 0 -1
1) "three"
2) "two"
127.0.0.1:6379>
rpoplpush # 移除列表的最后一个元素(右),将他移动到新的列表中!
127.0.0.1:6379> lpush key one
(integer) 1
127.0.0.1:6379> lpush key two
(integer) 2
127.0.0.1:6379> lpush key three
(integer) 3
127.0.0.1:6379> lpush key1 four
(integer) 1
127.0.0.1:6379> lrange key 0 -1 # 查看原来的列表(key)
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange key1 0 -1 # 查看原来的列表(key1)
1) "four"
127.0.0.1:6379> rpoplpush key key1 # 移除列表中最后一个元素,并将移除元素添加到新列表中
"one"
127.0.0.1:6379> lrange key 0 -1 #查看移除的列表
1) "three"
2) "two"
127.0.0.1:6379> lrange key1 0 -1 #查看新填的列表
1) "one"
2) "four"
lset 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> lpush key fanlan
(integer) 1
127.0.0.1:6379> lpush key woshifanlan
(integer) 2
127.0.0.1:6379> lrange key 0 -1 #获取list指定范围的值
1) "woshifanlan"
2) "fanlan"
127.0.0.1:6379> lset key 0 fx #更新list列表指定下标的存在时,会替换
OK
127.0.0.1:6379> lrange key 0 -1
1) "fx"
2) "fanlan"
127.0.0.1:6379> lset key 2 fanlan #更新list列表,索引不存在时会包错
(error) ERR index out of range
linsert # 将某个具体的value插入到指定某个元素的前后
127.0.0.1:6379> lrange key 0 -1 #
1) "fx"
2) "fanlan"
127.0.0.1:6379> linsert key before fanlan woshifanlan #将我是泛滥插入到fanlan前面
(integer) 3
127.0.0.1:6379> lrange key 0 -1
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> linsert key after fanlan zfx #将我是泛滥插入到fanlan后面
(integer) 4
127.0.0.1:6379> lrange key 0 -1 #获取指定list区间的值
1) "fx"
2) "woshifanlan"
3) "fanlan"
4) "zfx"
127.0.0.1:6379>
实际上是一个链表,before Node after , left,right 都可以插入值
如果key 不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~
消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!
Set(集合)
set中的值是不能重读的!
在这里插入代码片
Set(集合)
set中的值是不能重读的!
127.0.0.1:6379> sadd name fanlan #向集合中添加元素
(integer) 1
127.0.0.1:6379> sadd name woshifanlan
(integer) 1
127.0.0.1:6379> sadd name fanlan
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> smembers name #查看集合当中的元素
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> sismember name fanlan #判断集合中是否有这个元素 1 表示 有
(integer) 1
127.0.0.1:6379> sismember name fx #判断集合中是否有这个元素 0 表示 没有
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> scard name #获取集合当中元素的个数len的作用一样
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> scard name #查看集合当中元素的个数
(integer) 2
127.0.0.1:6379> smembers name #查看set集合当中所有的值
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> srem name fanlan #移除集合当中指定的值
(integer) 1
127.0.0.1:6379> smembers name
1) "woshifanlan"
127.0.0.1:6379> sadd name fanlan #向集合当中添加值
(integer) 1
127.0.0.1:6379> sadd name zfx
(integer) 1
127.0.0.1:6379> sadd name fx
(integer) 1
127.0.0.1:6379> smembers name #查看集合当中的值
1) "zfx"
2) "fanlan"
3) "fx"
4) "woshifanlan"
127.0.0.1:6379> srandmember name # 随机抽选出一个元
"fx"
127.0.0.1:6379> srandmember name 2
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> smembers name #查看集合中的所有值
1) "zfx"
2) "fanlan"
3) "fx"
4) "woshifanlan"
127.0.0.1:6379> spop name #随机删除集合当中的值
"woshifanlan"
127.0.0.1:6379> smembers name
1) "zfx"
2) "fanlan"
3) "fx"
127.0.0.1:6379> sadd name1 fanlan
(integer) 1
127.0.0.1:6379> smove name name1 fx " #将一个指定的值,移动到另外一个set集当中
(integer) 1
127.0.0.1:6379> smembers name1 #查看另一个集合已经移入
1) "fanlan"
2) "fx"
127.0.0.1:6379>
数字集合类:
- 差集 sdiff 一般地,设A,B是两个 集合,由所有属于A且不属于B的元素组成的集合,叫做集合A减 集合B( 或 集合A与集合B之差),记作A-B(或A\B),即A-B={x|x∈A,且x B}(或A\B={x |x∈A,且x B}.
- 交集 sinsert
- 并集 sunion
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b c
(integer) 2
127.0.0.1:6379> sadd ket1 b c d
(integer) 3
127.0.0.1:6379> smembers key1
1) "a"
127.0.0.1:6379> smembers ket1
1) "b"
2) "d"
3) "c"
127.0.0.1:6379> smembers key1
1) "b"
2) "c"
3) "a"
127.0.0.1:6379> sdiff key1 ket1 #key1-ket1的差集就是a
1) "a"
127.0.0.1:6379> sdiff ket1 key1 #ket1-key1的差集就是d
1) "d"
127.0.0.1:6379> sinter key1 ket1 #交集
1) "b"
2) "c"
127.0.0.1:6379> sunion key1 ket1 #并集
1) "b"
2) "d"
3) "a"
4) "c"
微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)
Hash(哈希)
Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的
key-vlaue!
key-map key-(key value)
127.0.0.1:6379> hset name fanlan fx #设置hset值
(integer) 1
127.0.0.1:6379> hget name fanlan #获取hset值
"fx"
127.0.0.1:6379> hmset name fanlan zfx fanlan1 woshifanlan # 设置set多个 key-vlaue
OK
127.0.0.1:6379> hmget name fanlan fanlan1 #获取get多个字段值
1) "zfx"
2) "woshifanlan"
127.0.0.1:6379> hgetall name #获取全部数据
1) "fanlan"
2) "zfx"
3) "fanlan1"
4) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name #获取全部hash数据
1) "fanlan"
2) "zfx"
3) "fanlan1"
4) "woshifanlan"
127.0.0.1:6379> hdel name fanlan #删除指定key的值
(integer) 1
127.0.0.1:6379> hgetall name #查看之后的hash值
1) "fanlan1"
2) "woshifanlan"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name #查看hash表的所有值
1) "fanlan1"
2) "woshifanlan"
3) "fanlan"
4) "fx"
5) "fanlan2"
6) "zfx"
127.0.0.1:6379> hlen name # 获取hash表的字段数量!
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379> hexists name fanlan # 判断hash中指定字段是否存在!1存在
(integer) 1
127.0.0.1:6379> hexists name fn #0 不存在
(integer) 0
127.0.0.1:6379>
# 只获得所有field
# 只获得所有value
127.0.0.1:6379> hkeys name #获取所有的fieid
1) "fanlan1"
2) "fanlan"
3) "fanlan2"
127.0.0.1:6379> hvals name #获取所有的value
1) "woshifanlan"
2) "fx"
3) "zfx"
127.0.0.1:6379>
127.0.0.1:6379> hgetall name #获取所有值
1) "fanlan1"
2) "woshifanlan"
3) "fanlan"
4) "1"
5) "fanlan2"
6) "zfx"
7) "fanlan3"
8) "8"
127.0.0.1:6379> hset name fanlan4 1 #指定初始值
(integer) 1
127.0.0.1:6379> hincrby name fanlan4 2 #指定值+2
(integer) 3
127.0.0.1:6379> hincrby name fanlan4 -1 #指定值-1
(integer) 2
127.0.0.1:6379> hsetnx name fanlan5 hello # 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx name fanlan5 world # 如果存在则不能设置
(integer) 0
127.0.0.1:6379>
hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的
存储,String更加适合字符串存储!
Zset(有序集合)
在set的基础上 set key value ----->zset key score value
127.0.0.1:6379> zadd name 1 fanlan #添加一个值
(integer) 1
127.0.0.1:6379> zadd name 2 fx 3 woshifanlan #添加多个值
(integer) 2
127.0.0.1:6379> zrange name 0 -1 #查看有序集合中区间内的所有值
1) "fanlan"
2) "fx"
3) "woshifanlan"
#有序集合 升序
127.0.0.1:6379> zadd salary 2000 fanlan #添加三个值
(integer) 1
127.0.0.1:6379> zadd salary 2500 woshifanlan
(integer) 1
127.0.0.1:6379> zadd salary 3000 fx
(integer) 1
127.0.0.1:6379> zrange salary 0 -1 #查看所有用户
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrangebyscore salsry -inf +inf #查询的是不存在的所以报错
(empty list or set)
127.0.0.1:6379> zrangebyscore salary -inf +inf #排序从小到大
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #排序用户工资从小到大(升序)相应的工资与用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
# 有序集合降序
127.0.0.1:6379> zrevrange salary 0 -1 #排序 从大到小
1) "fx"
2) "woshifanlan"
3) "fanlan"
127.0.0.1:6379> zrevrange salary 0 -1 withscores ##排序用户工资从大到小(降序)相应的工资与用户
1) "fx"
2) "3000"
3) "woshifanlan"
4) "2500"
5) "fanlan"
6) "2000"
127.0.0.1:6379> zrangebyscore salary -inf 3000 withscores #用户工资小3000的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #用户小于2500的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
127.0.0.1:6379>
127.0.0.1:6379> zrangebyscore salary 2000 +inf withscores #用户大于2000的用户
1) "fanlan"
2) "2000"
3) "woshifanlan"
4) "2500"
5) "fx"
6) "3000"
127.0.0.1:6379>
127.0.0.1:6379> zrange salary 0 -1 #查询zset集合当中所有值
1) "fanlan"
2) "woshifanlan"
3) "fx"
127.0.0.1:6379> zrem salary fx #移除zset集合当中指定的值
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "fanlan"
2) "woshifanlan"
127.0.0.1:6379> zcard salary #获取zset集合当中的个类似于len
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> zadd number 1 fx
(integer) 1
127.0.0.1:6379> zadd number 2 fanlan 3 woshifanlan
(integer) 2
127.0.0.1:6379> zrange number 0 -1 withscores
1) "fx"
2) "1"
3) "fanlan"
4) "2"
5) "woshifanlan"
6) "3"
127.0.0.1:6379> zcount number 0 3 #获取zset集合当中指定区间的成员个数
(integer) 3
127.0.0.1:6379>
案例思路:set 排序 存储班级成绩表,工资表排序!
普通消息,1, 重要消息 2,带权重进行判断!
排行榜应用实现,取Top N 测试