redis数据库

redis

redis存储

为什么redis是内存数据库,却能做到数据持久化?
redis 里面的 rdb (Redis DataBase)和 aof (Append Only File)文件  (内存数据库) 数据持久化
Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。
RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。
AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。 # 简单来说就是记录日志


Redis 针对 AOF文件大的问题,提供重写的瘦身机制。
若只打算用Redis 做缓存,可以关闭持久化。
若打算使用Redis 的持久化。建议RDB和AOF都开启。其实RDB更适合做数据的备份,留一后手。AOF出问题了,还有RDB。

redis操作

# 额外的数据类型 了解就行了
HyperLogLogs
geospatial(Bit arrays)
Streams

redis是key-value的数据结构,每条数据都是⼀个键值对,但是不用像字典一样写冒号,剩下的和字典一样,键的类型是字符串,并且key不能重复

#基本操作
登录:redis-cli
退出exit
切换数据库:select n   有0-15共16个
操作服务端:sudo service redis start/stop/restart

ubuntu里不能输入中文,可以在pycharm里输入,去Ubuntu里查看,但是如果是用redis-cli登陆的话,会显示你pycharm里输入的中文的编码,utf-8编码了,这时候就要redis-cli --raw登录才能查看中文
如果不指定数据库,则默认是0号数据库

#####对redis五种数据类型都适用的命令:
查看所有的key:keys*
删除键值对:del key
改名:rename key new_key
设置过期时间:expire key seconds
查看key是否存在:exists key
查看数据类型:type key

redis数据类型

String

场景:计数器

设置数据:set key value
  set name flz
查看数据:get key
  get name
  如果你第一次给name一个值,第二次又给他的话,第二次给的会把第一次给的覆盖掉
set name flz  
get name
"flz"
set name aaa
get name
"aaa"

拼接:append
append name qqq
(integer) 6
get name
"aaaqqq"

删除:del key

设置多个 mset key1 value key2 value key3 value
查看多个 mget key1 key2 key3

#因为有五种数据类型,所以一般起名字的时候会这样起:string_qwe,前面是数据类型

set name3 5

自加:incr
127.0.0.1:6379> incr name3
(integer) 6
127.0.0.1:6379> incr name3
(integer) 7
127.0.0.1:6379> incr name3
(integer) 8
127.0.0.1:6379> incr name3
(integer) 9

自减:decr
127.0.0.1:6379> decr name3
(integer) 8
127.0.0.1:6379> decr name3
(integer) 7
127.0.0.1:6379> decr name3
(integer) 6
127.0.0.1:6379> decr name3
(integer) 5
127.0.0.1:6379> decr name3
(integer) 4
127.0.0.1:6379> decr name3
(integer) 3

加:incrby
127.0.0.1:6379> incrby name3 12
(integer) 15

减:decrby
127.0.0.1:6379> decrby name3 9
(integer) 6

exists key   #查看key是否存在
rename 旧key 新key  #改key的名字

过期时间

expire key 秒数

127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> get name
"aaaqqq"
127.0.0.1:6379> get name
(nil)
#过十秒以后会自动删除,用这个必须先给一个key-value

persist key  #删除过期时间
127.0.0.1:6379> set name1 zzz
OK
127.0.0.1:6379> expire name1 100
(integer) 1
127.0.0.1:6379> persist name1
(integer) 1
127.0.0.1:6379> get name1
"zzz"
#过多长时间都不会删除

也可以去查看一下有没有设置过期时间
127.0.0.1:6379> ttl name1
(integer) -1
127.0.0.1:6379> ttl name
(integer) -2

删除value的话key也就跟着自动删除了,就像上一步过期时间把name的value删了,再去查找就没有了
127.0.0.1:6379> keys *
1) "name1"

ttl  ---> -1:没有过期时间
ttl  ---> -2:没有这个键值对数据,不存在于redis中,即便你以前创建过这个键值对,但是就像上一步过期时间中已经把value删了,他也是不存在的

创建键值对的时候就设置过期时间
set key value ex 秒数

Lists

# 消息队列,排行榜,最新列表
#添加数据:
  左添加:lpush key value (头部添加)
  右添加:rpush key value (尾部添加)
  一个key添加多个value:l/rpush key value1 value2 value3...

#查看数据:lrange key start stop  
127.0.0.1:6379[1]> rpush name1 a1 a2 a3 a4 a5 a6 a7 a8 a9
(integer) 9
127.0.0.1:6379[1]> get name1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379[1]> lrange name1 0 -1
1) "a1"
2) "a2"
3) "a3"
4) "a4"
5) "a5"
6) "a6"
7) "a7"
8) "a8"
9) "a9"

127.0.0.1:6379[1]> rrange name1 0 -1  #查只有lrange
(error) ERR unknown command 'rrange'

#python中range是左闭右开,redis中是左闭右闭
127.0.0.1:6379[1]> lrange name1 0 9
1) "a1"
2) "a2"
3) "a3"
4) "a4"
5) "a5"
6) "a6"
7) "a7"
8) "a8"
9) "a9"

#lpush name1 q1 q2
127.0.0.1:6379[1]> lpush name1 q1 q2
(integer) 11
127.0.0.1:6379[1]> lrange name1 0 -1
1) "q2"
2) "q1"
3) "a1"
4) "a2"
5) "a3"
6) "a4"
7) "a5"
8) "a6"
9) "a7"
10) "a8"
11) "a9"

#rpush name1 z1 z2
127.0.0.1:6379[1]> rpush name1 z1 z2
(integer) 13
127.0.0.1:6379[1]> lrange name1 0 -1
1) "q2"
2) "q1"
3) "a1"
4) "a2"
5) "a3"
6) "a4"
7) "a5"
8) "a6"
9) "a7"
10) "a8"
11) "a9"
12) "z1"
13) "z2"

#索引查找: lindex key 索引值
127.0.0.1:6379[1]> lindex name1 3   #计算机内部都是从0开始排
"a2"

#修改:lset key 索引值 value             没有rset
127.0.0.1:6379[1]> lset name1 5 ppppp
OK
127.0.0.1:6379[1]> lrange name1 0 -1
1) "q2"
2) "q1"
3) "a1"
4) "a2"
5) "a3"
6) "ppppp"
7) "a5"
8) "a6"
9) "a7"
10) "a8"
11) "a9"
12) "z1"
13) "z2"

#删除:rpop,lpop
127.0.0.1:6379[1]> rpop name1
"z2"
127.0.0.1:6379[1]> lpop name1
"q2"
#取出来值然后再删,所以这个值是可以用的

#删除全部重复的,从左向右找
127.0.0.1:6379[1]> lrem name1 0 a9
(integer) 1
127.0.0.1:6379[1]> lrem name1 0 a9
(integer) 0

127.0.0.1:6379[1]> rpush name1 11 11 11 11 11
(integer) 15
127.0.0.1:6379[1]> lrem name1 2 11
(integer) 2
127.0.0.1:6379[1]> lrange name1 0 -1
1) "q1"
2) "a1"
3) "a2"
4) "a3"
5) "ppppp"
6) "a5"
7) "a6"
8) "a7"
9) "a8"
10) "z1"
11) "11"
12) "11"
13) "11"

#lrem key n1 n2:n1如果是1是就是正着删指定的数,如果是-1就是倒着删指定的数,n2:要删除的数据
127.0.0.1:6379[1]> lpush name1 22 22
(integer) 17
127.0.0.1:6379[1]> rpush name1 22 22
(integer) 19
127.0.0.1:6379[1]> lrange name1 0 -1
1) "22"
2) "22"
3) "11"
4) "11"
5) "11"
6) "q1"
7) "a1"
8) "a2"
9) "a3"
10) "ppppp"
11) "a5"
12) "a6"
13) "a7"
14) "a8"
15) "z1"
16) "11"
17) "11"
18) "22"
19) "22"
127.0.0.1:6379[1]> lrem name1 1 11
(integer) 1
127.0.0.1:6379[1]> lrem name1 -1 11
(integer) 1
127.0.0.1:6379[1]> lrange name1 0 -1
1) "22"
2) "22"
3) "11"
4) "11"
5) "q1"
6) "a1"
7) "a2"
8) "a3"
9) "ppppp"
10) "a5"
11) "a6"
12) "a7"
13) "a8"
14) "z1"
15) "11"
16) "22"
17) "22"

#删几个
127.0.0.1:6379[1]> lrem name1 -2 22
(integer) 2
127.0.0.1:6379[1]> lrange name1 0 -1
1) "22"
2) "22"
3) "11"
4) "11"
5) "q1"
6) "a1"
7) "a2"
8) "a3"
9) "ppppp"
10) "a5"
11) "a6"
12) "a7"
13) "a8"
14) "z1"
15) "11"

# 了解
lrem mylist 0 "value"   #从mylist中删除全部等值value的元素   0为全部,负值为从尾部开始 1 正向删除
ltrim mylist 1 -1       #保留mylist中 1到末尾的值,即删除第一个值

 

Hashes

#场景:购物车
#哈希必须设置一个域

####key不能重复,如果域名重复的话它也不会给你提示,直接就覆盖掉了###

#添加数据:hset key field value   #一个key可以对应多个域
127.0.0.1:6379[3]> hset name1 yu jack1
(integer) 1
127.0.0.1:6379[3]> hset name1 yu2 jack2
(integer) 1

#查看数据:hget key field     #如果域名不存在则会返回一个空
127.0.0.1:6379[3]> hget name1 yu
"jack1"
127.0.0.1:6379[3]> hget name1 yu2
"jack2"

#查看一个key下所有的value : hmget key 域名1 域名2...
127.0.0.1:6379[3]> hmget name1 yu1 yu2
1) (nil)
2) "jack2"
127.0.0.1:6379[3]> hmget name1 yu yu2
1) "jack1"
2) "jack2"

127.0.0.1:6379[3]> hmget name1
(error) ERR wrong number of arguments for 'hmget' command


#传入多个域名以及value : hmset key 域名1 value1 域名2 value2...
127.0.0.1:6379[3]> hmset name1 yu3 11 yu4 12 yu5 13
OK
127.0.0.1:6379[3]> hmget name1 yu3 yu4 yu5
1) "11"
2) "12"
3) "13"

#查看指定key的所有value:hvals key
127.0.0.1:6379[3]> hvals name1
1) "jack1"
2) "jack2"
3) "11"
4) "12"
5) "13"

#查看所有的域:hkeys key
127.0.0.1:6379[3]> hkeys name1
1) "yu"
2) "yu2"
3) "yu3"
4) "yu4"
5) "yu5"

#查看所有的field和value:hgetall key
127.0.0.1:6379[3]> hgetall name1
1) "yu"
2) "jack1"
3) "yu2"
4) "jack2"
5) "yu3"
6) "11"
7) "yu4"
8) "12"
9) "yu5"
10) "13"

#查看有几个域:hlen key
127.0.0.1:6379[3]> hlen name1
(integer) 5

#增量:hincrby
127.0.0.1:6379[3]> hset name age 23
(integer) 1
127.0.0.1:6379[3]> hincrby name age 5
(integer) 28

#删除域:hdel
该命令可以同时删除多个字段,返回值是被删除字段的数量。
field 存在,删除字段,返回被删除字段的数量。
field 不存在, 返回0

Redis的key value键值对模式不变,但value是一个键值对。

Sets

set类型是string类型的集合,其特点是集合元素无序且不重复
# 好友/关注/粉丝/感兴趣的人集合,随机展示, 黑名单/白名单

#添加数据:sadd key member
127.0.0.1:6379[5]> sadd name1 q1 q2 q3 q4 q5
(integer) 5

#查看数据:smembers key     #添加数据后是随机排序的
127.0.0.1:6379[5]> smembers name1
1) "q4"
2) "q3"
3) "q1"
4) "q2"
5) "q5"

#随机删除:spop key
127.0.0.1:6379[5]> spop name1
"q2"
127.0.0.1:6379[5]> spop name1
"q4"
                                    ###pop删都是把值取出来再删,这个值可以使用
#随机删除多个:spop key n
127.0.0.1:6379[5]> spop name1 2
1) "q3"
2) "q1"

#指定删除:srem key member value
127.0.0.1:6379[5]> srem name1 member a3
(integer) 1       #1是一种状态,删成功了
127.0.0.1:6379[5]> srem name1 member qq
(integer) 0       #0的话就是没有删到数据

#查看还剩几个数据:scard key
127.0.0.1:6379[5]> scard name1
(integer) 5

#指定删除多个元素:srem key member value1 value2 value3...
127.0.0.1:6379[5]> srem name1 member a1 a2
(integer) 2

Sorted sets

#也叫zset,对执行命令的先后进行排序
#延时队列,排行榜,限流

#每一个成员都会有一个分数(score)与之关联。
#成员是唯一的,但是分数(score)却是可以重复的

#添加数据:zadd key score member
127.0.0.1:6379[6]> zadd name 10 y1 20 y2 30 y3 40 y4 50 y5 60 y6
(integer) 6

#查看所有人:zrange key start stop
127.0.0.1:6379[6]> zrange name 0 -1
1) "y1"
2) "y2"
3) "y3"
4) "y4"
5) "y5"
6) "y6"
7) "y7"

#通过scores值查看这个人是谁:zrangebyscore key min max
127.0.0.1:6379[6]> zrangebyscore name 20 50
1) "y2"
2) "y3"
3) "y4"
4) "y5"
  #只想要一个分数的话就是:
  127.0.0.1:6379[6]> zrangebyscore name 60 60
  1) "y6"
  2) "y7"
#通过人查分数(查权重):zscore key values
127.0.0.1:6379[6]> zscore name y3
"30"

#查有共几个人(数量):zcard key
127.0.0.1:6379[6]> zcard name
(integer) 7

#删除数据:zrem key value
127.0.0.1:6379[6]> zrem name y1 y2
(integer) 2

#通过索引删除多个数据:zremrangebyrank key min max   (计算机内部排序0,1,2,3...)
127.0.0.1:6379[6]> zremrangebyrank name 1 3
(integer) 3
127.0.0.1:6379[6]> zrange name 0 -1
1) "y3"
2) "y7"

#依据key去删除:zremrangebyscore key min max
127.0.0.1:6379[6]> zremrangebyscore name 20 60
(integer) 2
127.0.0.1:6379[6]> zrange name 0 -1
(empty list or set)   #删完以后就没数据了

#一个value被删除以后,对应的key会自动被删

拓展

三个命令
flushdb   # 删除当前数据库里的键
flushall  # 所有数据库里面的键

subscribe 110 订阅 频道号

publish 110 "hello world"

 

posted on 2022-03-05 15:30  请你一定要记得我好吗  阅读(323)  评论(0)    收藏  举报