Redis

Redis介绍

1.redis是开源的,免费的,高性能的非关系型数据库
2.数据存储在内存,以key-value(键值对)形式存储,类似于我们学习的字典 {name: ‘jack’ }
3.可以设置过期时间,过期自动删除,也可以做持久化

初始默认只分配了 512M的内存

如果存满的话,会按照一定策略来删除

Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

过期策略通常有以下三种:

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期扫描:每隔一定的时间,会扫描expires字典中key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

关系型数据库 :MySQL

MySQL的缺陷:

1.读取速度快
2.读写是容易混淆
3.需要定义严格的表结构
4.数据存储在磁盘,相对于内存数据库,读写速度慢

非关系型数据库:Redis在非关系型数据库中没有表这个概念,也就没有表关系这样的概念,都是K/V格式的
Redis优势:性能极高-Redis读的速度是11w次/s写的速度是8.1w次/s,都是基于内存的,读写速度比较快
丰富的数据类型-Redis支持Stringd,Lists,Hashes,Sets及Ordered Sets数据类型操作
原子性-Redis的所有操作都是原子性的,要么成功执行,要么失败不执行。支持简单的事务,即原子性,通过MULTI和EXEC指令包起来
丰富的特性-Redis还支持publish/subscriibe,通知,key过期等等特性
Redis的缺点:
基于内存性数据库,主机断电时数据全部丢失
key同时过期会造成Redis数据库的"雪崩",容易把整个服务搞垮

安装

1.下载压缩包

下载地址:https://github.com/tporadowski/redis/releases

备用:https://hub.fastgit.xyz/tporadowski/redis/releases 切记:镜像站不要登录自己的github账号!!!
2.解压压缩包
3.配置环境变量
4.注册服务并绑定使用的配置文件

redis-server --service-install 配置文件地址  # 安装服务
redis-server --service-uninstall  # 卸载服务

5.启动server程序

redis-server --service-start # 启动redis服务器
redis-server --service-stop # 停止redis服务器

注意:修改配置文件之后,需要重启redis服务器
6.客户端连接数据库

常见问题

# 问题1 
C:\Users\lenovo>redis-cli
Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝,无法连接。
not connected>

# 服务端没启动
# 解决
# 双击redis-server.exe启动即可

如何卸载

1.停止server程序

redis-server --service-stop # 停止redis服务器

2.卸载服务

redis-server --service-uninstall  # 卸载服务

3.删除环境变量
4.删除掉redis的那一条环境变量
5.删除redis的解压目录

Redis五大数据类型

  1. String 字符串类型
  2. List 列表
  3. Hash 哈希 理解成 python的字典 xiaoming = {“name”:“xiaoming”}
  4. Set 无序列表 [zhangsan,lisi ,wangwu]
  5. ZSet 有序列表 [zhangsan :60,lisi:100 ,wangwu:48] 默认从小到大

Redis通用命令

Redis 命令查询手册:https://www.lanmper.cn/redis/c467.html

redis默认有16个 数据库(0-15)
select 3 切换到数据库3

info 查看redis服务的信息
info replication查看主从复制的状况

keys * 查看所有的key, 生产环境中不使用
可能阻塞redis

查看key的数据类型
type key1

key 是否存在
exists key1

删除一个key
del key1

重命名
rename key key1

清空数据库
flushdb # 清空当前数据库

flushall # 清空所有数据库

常用命令

String类型

k e y − − > 字 符 串 / 数 值 key-->字符串/数值 key>/

  1. key 不宜过长,占用内存,也不宜过短,可读性差
    如:user:lauf
  2. 值,为字符串或者数值,最多存储512M
原生写法
# 增
set key value # 设置一个key-value 映射 value可以是字符串或者数字
mset key1 value1 key2 value2 ... # 同时设置多个key-value映射 
set key value ex 60 # 数据有效期60秒
set key value nx # 只有当key不存在时,才会存入

# 查
get key # 查看一个key的值
mget key1 key2 key3 ... # 同时获取多个key
strlen key1 # 获取key的长度
strrange key 0 4 # 获取字符串[0-4]之间的字符

# 改
set # set 命令也可以用来修改数据
setrange key 1 oooo # 修改字符串的一部分:从1的位置开始修改字符串,以oooo覆盖

# string的特殊类型:数字
# 数字可以直接增减
incr key # 自增 1
decr key # 自减 1
incrby key 5 # 自增 5
decrby key 5 # 自减 5

# 删
del name
python写法
# 第一步  安装库
# pip install redis  # 安装redis的库

# 第二步 导入redis的库
import redis # 导包

# 第三步 链接redis
r = redis.Redis(host="127.0.0.1",port=6379,password="123456",db=2)
# host 主机地址,默认localhost
# port reids 端口  默认6379
# password 密码 默认无密码
# db 你要连接的数据库编号 默认0  可选0-15

# 第四步 执行相应的命令
r.set("python_name","hello python")

name = r.get("python_name")
print(name)


# 参考命令
r.set(key,value,ex=60)

r.set(key,value,nx=True)

r.mset({key1,value1,key2,value2})

r.get(key)

r.mget(key1,key2)

r.strlen(key)

r.strrange(key,0,4)

r.setrange(key,1,'oooooo')

r.incr(key)
r.decr(key)

r.incrby(key,5)
r.decrby(key,5)

Set类型(无序列表,无序集合)

Set 是 String 类型无序的容器结构。集合成员是唯一的,不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

特点:无序的,元素不可重复的

原生写法
# 增
sadd room zhangsan lisi wangwu # 增加3个玩家到游戏中

# 查
smembers room # 查看当前所有在线的玩家
scard room # 查看当前房间里有多少玩家
sismember room zhangsan # 判断zhangsan是否已经加入游戏

# 改
srem room zhangsan lisi # 把zhangsan , lisi 从房间移除

# 删除
del name

Zset类型

它是 String 类型元素的有序集合,每个元素唯一且都会关联一个 double 类型的分值,根据分值来为集合中的成员从小到大排序。

原生写法
# 增
zadd guns 30 ak47 47 dp28 100 m247 


# 查
zrange guns 0 -1 [withscores]  # 查看guns 下面的所有枪械,按照从小到大排列
zrevrange guns 0 -1 [withscores] # 从大到小排列
zrange guns 1 3  # 查看guns的弹容量排名从 [1-3] 包含 1 3的枪械

zrangebyscore guns (30 100 # 查看弹容量在(30-100] 不包括30 之间的所有枪械
zrangebyscore guns 30 100 limit 2 1 withscores # 分页,每页1条,第三页
zrevrangebyscore guns 100 30 # 查看弹容量在(30-100]之间的所有枪械
zrevrangebyscore guns 100 30  limit 2 1 withscores # 分页,每页1条,第三页


zcard guns # 查看系统中枪的种类数
zcount guns (20 50 # 获取(20-50] 区间内的所有枪械数

zrank name dp28 # 按照从小到大,查看排名
zrevrank name dp28 # 按照从大到小

zscore guns ak47 # 查看ak47的弹容量

# 改
zincrby guns 10 m247 # 给m247枪增加10发子弹
zincrby guns -10 dp28 # 给dp28 减少10发子弹

zrem guns ak47 ... # 按照字符串来移除元素,可同时多个
zremrangebyrank guns 1 2 # 按照弹容量排名  0-3 区间内的元素移除
zremrangebyscore guns 0 30 # 把弹容量小于30发的,全部删除掉

# 删
del guns

Hash类型

哈希加密 关系不大

hash类型 大大降低了查找时候的难度 O(1)

ak47 -> 弹容量 威力

ak47 = {
    "name":"ak47",
    "bullet":30,
    "bullet_now":27,
    "power":50,
    "num":1,
}

ak47 键
name / bullet 名
ak47 / 30  值


世间万物,全部转化成这种形式

角色 = {
    性别:男、女
    攻击力:
    防御力:
    技能
    等级
}

Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储字典数据。

原生写法
# 增
hset ak47 num 1 bullet 30 now_bullet 27 power 50 # 设置一个ak47Hash字典,分别是 数量 弹容量 当前子弹  威力


# 查
hget ak47 bullet # 获取ak47的弹容量

hkeys ak47 # 获取ak47的所有属性
hvals ak47 # 获取ak47的所有值
hgetall ak47 # 获取ak47下面的所有字段和值


# 改
hdel ak47 num # 删除一个或多个字段

# 删
del guns

List类型

name = [“zhangsan”,“lisi”,“wangwu”]

原生写法
# 增 l left 左    r right 右
lpush history maoyi liangtuo leifengmao # 从list左边依次插入,顺序要注意
rpush history bijini # 从列表右边依次插入

# 查
lrange history 0 -1 # 查看所有
lrange history 0 4 # 查看下标为[0-4]的元素

# 改
lset history 2 qiuyi # 修改指定下标的元素值
lpop history # 从左边删除一个元素
rpop history # 从右边删除一个元素
lrem history 5 chenyi # 删除name中值为zhangsan的元素 最多删除5个,0为删除所有
ltrim history 1 5 # 只保留数组中[1-5]的元素,把其他的删除掉

# 删除
del history
brpop history 5 # 当list为空时,删除整个LIST,并阻塞redis进程5秒中
blpop history 5 # 删除整个list 并阻塞redis进程5秒中
设置过期时间
#1 10s过期
set name jack ex 10
#2 
set name jack
expire name 10 -->10s
pexpire name 10 -->10ms

#查看多久过期
ttl name
-->返回-2 key不存在
-->返回-1 key存在,但没有过期时间
-->返回具体时间,剩余过期时间

#设置永不过期,此命令很少使用
persist name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值