目录
redis概述
Redis
本质上是一个
Key
-
Value
类型的内存数据库,整个数据库统统加载在内
存当中进行操作,定期通过异步操作把数据库数据
flush
到硬盘上进行保存。因
为是纯内存操作,
Redis
的性能非常出色,每秒可以处理超过
10
万次读写操
作,是已知性能最快的
Key
-
Value DB
。
Redis
的出色之处不仅仅是性能,
Redis
最大的魅力是支持保存多种数据结构,
此外单个
value
的最大限制是
1GB
,因此
Redis
可以用来实现很多有用的功能,
比方说用他的
List
来做
FIFO
双向链表,实现一个轻量级的高性 能消息队列服
务等等。
Redis
的主要缺点是数据库容量受到物理内存的限制,不能用作海量
数据的高性能读写,因此
Redis
适合的场景主要局限在较小数据量的高性能操作
和运算上。
(
1
)、会话缓存(
Session Cache
)
(
2
)、全页缓存(
FPC
)
(
3
)、队列
(
4
)、排行榜
/
计数器
(
5
)、发布
/
订阅
redis存储
redis
里面的
rdb
(
Redis DataBase
)和
aof
(
Append Only
File
)文件 (内存数据库) 数据持久化
Redis
默认开启
RDB
持久化方式,在指定的时间间隔内,执行指定次数的写操
作,则将内存中的数据写入到磁盘中。
RDB
持久化适合大规模的数据恢复但它的数据一致性和完整性较差。
Redis
需要手动开启
AOF
持久化方式,默认是每秒将写操作日志追加到
AOF
文件
中。
AOF
的数据完整性比
RDB
高,但记录内容多了,会影响数据恢复的效率。
redis操作
16
个数据库
0
到
15
redis-cli
6379
默认监听端口
--raw
输出中文
进入
redis
redis-cli
select
0
-15
自由选择
HyperLogLogs
geospatial
Bit arrays
Streams
redis数据类型
string计数器
string
类型的
incr
和
decr
命令的作用是将
key
中储存的数字值加一
/
减一,这
两个操作具有原子性,总能安全地进行加减操作,因此可以用
string
类型进行
计数,如微博的评论数、点赞数、分享数,抖音作品的收藏数,京东商品的销售
量、评价数等。
# string
set
name qiye
get
name
keys *
查看所有的
KEYapp
如何删除所有的数据
追加类容
append name1 jack2
#
会自动创建
get
name
append name jack
get
name
"qiyejack"
del name
删除
设置多个
mset name1 jack1 name2 jack2
查看多个
mget name1 name2
自加:
incr
自减:
decr
加:
incrby
减:
decrby
type name1
# string
str_name1 (
见名知意
)
exists name1
#
查看多少个
key
rename name1 name2
#
改名字
过期时间
expire name2
10
persist name2
ttl
返回
-1
代表没有过期时间
ttl
返回
-2
已经过期了
创建键的时候就设置过期时间
set
name3 jack3 ex
5
Lists
list
#
创建一个键
rpush lname y1 y2 y3 y4 y5 y6 y7
type lname
#
查看
lrange lname
0
-1
左插入
lpush lname g5 g6
右插入
rpush lname g7 g8
索引查找:
lindex lname
3
#
修改
lset lname
2
y10
#
删除
rpop lname
#
删除最后面的
lpop lname
#
删除最前面的
lrem mylist
0
"value"
ltrim mylist
1
-1
Hashes
添加数据:
hset hname name1 jack1
keys *
hget hname name1
hset hnmae name2 jack2
hget hname name2
field
存在,正常读取
field
对应的值。
field
不存在,返回
nil
hmset
field
不存在,直接存储。
field
存在,执行覆盖操作
hmset name1 qiye1
1
qiye2
2
qiye3
3
hmget
hmget name1 qiye1 qiye2 qiye3
hdel
删除域
该命令可以同时删除多个字段,返回值是被删除字段的数量。
field
存在,删除字段,返回被删除字段的数量。
field
不存在, 返回
0
hgetall hname
域值对
#
读取全部
hvals hname
#
获取指定
key
所有字段的值
hlen hname
#
多少个域值对
#
增量(
hincrby
) 实现加法
hset name10 age
23
hincrby name10 age
3
# 26
Sets
添加数据:
sadd sname g1 g2 g3 g1
查看:
smembers sname
spop sname
#
随机
spop sname
2
#
数据删两个
srem sname member g1
#
指定删除 可指定多个
scard sname
#
获取有多少个元素
zset -- Sorted sets
添加数据:
zadd zname
10
y2
20
y3
30
y4
40
y5
查看数据:
zrange zname
0
-1
zrangebyscore zname
0 100
分数
zrangebyscore zname
0 20
zscore zname y3
#
查看分数
zcard zname
#
查找多少个元素
删除数据:
zrem zname y1
zremrangebyrank zname
0 2
#
索引删除
zremrangebyscore zname
0 20
#
分数删除
与pythen的交互
```python
import redis
redis-cli --raw 查看中文
# decode_responses = True 让redis返回的数据是str类型,如果不指定则结果为bytes. ‘中文’
red = redis.StrictRedis(host='127.0.0.1',decode_responses = True)
print(type(red.keys()))
print(red.keys())
string
# red.set('name','haha')
red.set('name','柒叶') # 覆盖
ret = red.get('name')
print(ret)
print(red.keys())
red.rename('name','new_ex_name') # 改键名
print(red.keys())
print(red.ttl('name'))
设置过期时间
red.set('name', 'qiye', ex=10)
print(red.get("name"))
list
# 使用lpush从头部插入元素
red.lpush("mylist",10,20,20)
print(red.lrange("mylist",0,-1))
#使用rpush从尾部插入元素
red.rpush("mylist",40,50)
print(red.lrange("mylist",0,-1))
# 使用llen获取列表元素的个数
print(red.llen('mylist'))
# 使用linsert在列表的某个值的前后插入一个值
red.linsert("mylist", "before", 40, "蓝桥")
print(red.lrange("mylist",0,-1))
# 第一个参数为name,第二个参数为before/after,第三个参数是在某个元素值的前或者后,第四个参数是需要插入的值
# 使用lrem删除list的指定值
red.lrem("mylist",1,10) #第二个参数为个数
print(red.lrange("mylist",0,-1))
# 使用lpop移除列表最左侧的元素,并返回
print(red.lpop("mylist"))
# 使用lindex查询指定索引的的元素,并返回
print(red.lindex("mylist",1))
哈希
red.hset('hash_name','name','qiye')
print(red.hget('hash_name','name'))
在python已经被弃用了
# red.hmset('hash_name',{'name1':'baye','name2':'jiuye'})
# print(red.hmget('hash_name','name','name1','name2'))
# print(red.hgetall('hash_name'))
set
# 使用sadd进行添加元素到集合中
red.sadd("myset","a","b","c")
red.sadd("yourset","b","c","d")
# 使用smembers进行查询集合中的元素
print(red.smembers('myset'))
red.srem('set_name',3) # 移除元素
# 使用scard进行计算集合中的元素个数
print(red.scard('myset'))
# 使用sdiff进行计算两个集合之间的差集
# myset-yourset
print(red.sdiff("myset","yourset"))
# 使用sinter进行计算两个集合之间的交集
print(red.sinter("myset","yourset"))
# 使用sismember检查当前元素是否存在集合之中
print(red.sismember("myset","a"))
print(red.sismember("yourset","a"))
# spop
zset
#使用zadd进行添加元素到有序集合中
red.zadd("zzset_name",{"a":1,"b":2,"c":3,"d":4})
# 使用zrange返回有序集合范围内的元素
print(red.zrange('zzset_name',0,-1))
# 使用zcard进行计算有序集合中的元素个数
print(red.zcard('zzset_name'))
# 使用zcount返回有序集合中min--max权重之间的个数
print(red.zcount('zzset_name',3,4))
# 使用zscore返回对应权重的元素
print(red.zscore('zzset_name','b'))
# 使用zrem删除有序集合的指定元素
red.zrem('zzset_name','a')
print(red.zrange('zzset_name',0,-1))