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)