一、redis 主要的data type
- redis 的原生客户端
- redis 支持通过python php golang 等语言连接
- redis 主要适用场景
二、redis如何进行数据存储
- 非关系数据库 不使用二维表 redis 使用键值对完成数据的存储
- redis一共有16个库 ,不同的库使用编号 0-15
- redis 在存储每一个键值对的时候,为键分配对应的slot
- redis优先在内存中完成数据的读取 写入 修改等操作 // redis 数据操作速度很快
- redis的服务端进程在运行期间向操作系统申请内存,保存数据,一旦服务端进程停止,操作系统给进程分配的内存等系统资源都会回收,重新启动redis 服务端之后,进程再次向操作系统申请内存,操作系统将给进程 分配新的内存页,如果redis只在内存中保存数据那么就很容易发生数据丢失。内存属于易失性存储。
- 基于5的问题,redis 提出了数据持久化的策略
- rdb redis database 对数据进行快照,并保存到指定文件,再重启后从指定的快照文件恢复数据
- rdb 持久化在大部分情况下都是默认启用
- save 时间:以秒为单位 次数:数据变更操作的次数 //在规定时间间隔中,数据变更的次数达到指定次数,则对redis进行快照.快照由bgsave 指令完成
- rdb文件名称 rdbfilename
- 文件的保存位置 dir
- 在每一次redis 服务端进程停止的时候,自动执行一个bgsave 更新rdb数据快照
- aof append only file 持续追踪redis数据变更,并将数据变更的指令写入aof文件中,所以aof 文件实际是记录redis数据操作的日志文件
- aof持久化在更新aof文件,有三种策略 appendfsync
- no 使用操作系统默认时间设置更新AOF文件,一般在linux操作系统中为半个小时 更新需要的时间更久,也比较容易发生数据丢失的情况
- everysec 每一秒更新AOF文件 文件更新速率更加频繁,数据不容易丢失
- always 追踪每一个数据变更操作,一旦发生就更新到AOF文件中 最不可能发生数据丢失,但是需要频繁更新AOF文件
- aof 策略默认不启用,需要手动启用
- appendonly 值为yes 代表启用,值为no代表不启用
- aof 因为是一个只增文件,所以文件大小会不断增加,所以在文件大小超过一定大小后,需要对文件进行重写,以压缩AOF文件大小
- aof的重写策略
- 文件大小
- 和文件相较于上一次重写时的大小
- AOF文件的重写 是通过 bgrewriteaof 指令实现
- aof的重写策略
- 在aof 和 rdb 同时启用情况下,redis 优先从aof文件进行数据恢复,rdb文件就会被忽略
- 在同时启用的情况下,一定要保证在启用aof前通过,先创建AOF文件,否则可能发生数据丢失的情况
- aof持久化在更新aof文件,有三种策略 appendfsync
- rdb redis database 对数据进行快照,并保存到指定文件,再重启后从指定的快照文件恢复数据
三、redis 的安全模型
- redis 默认情况下,所有的数据操作由一个叫default的用户完成,这个用户没有使用任何的密码保护,并且所有的redis实例都有default
- redis 默认情况下 仅监听环回口 lo逻辑端口 redis 还支持通过socket 套接字文件进行访问 以上的链接服务端的设置,都限制redis的客户端必须和redis服务端在同一个节点
- 如果redis 被配置为监听非LOOPBACK地址后,需要开启保护模式,在保护模式下,所有用户的访问必须要验证密码,仅允许在127.0.0.1 上登录redis的用户不需要验证口令
修改redis监听系统中所有的可用地址
vim /etc/redis/redis.conf
4. requirepass
可以直接配置一个访问redis实例的密码 所有客户端对于redis服务端的访问都使用同一个密码,同时密码以明文传输 所以安全性不够,redis更推荐使用专门的acl指令 另外配置用户 密码 和权限
redis 验证用户口令的命令
auth [用户名] 密码
[root@bogon ~]# systemctl restart redis
[root@bogon ~]# redis-cli
127.0.0.1:6379>
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required. // 提示需要密码
127.0.0.1:6379> auth redhat123
OK
127.0.0.1:6379> keys *
1) "bike2"
2) "counter"
3) "set2"
4) "bike:3"
5) "newke"
6) "bike"
7) "queue2"
8) "game_event"
9) "bike:2"
10) "eee"
11) "site1"
12) "sset1"
13) "bike:1"
14) "set1"
15) "newqueue"
16) "bike1"
127.0.0.1:6379> exit
5.ACL 指令
确保用户在使用给定用户访问时,使用最小权限
acl list 列出redis中所有的用户 密码 权限
127.0.0.1:6379> acl list
1)"user default on nopass ~* &* +@all" // 默认用户default的基本信息
用户default 账号启用,用户账号没有设定密码,允许用户控制所有的键值对和频道,用户有权运行任何redis指令
a.user // 用户账号
b.default // 用户名
c.on // 用户账号启用 即此用户可以访问redis数据库
d.nopass // 当前用户无密码 用户密码
// >密码 设置密码 此处提交明文密码,由redis进行加密
// #加密后的字符串 此处直接使用加密后的字符串提交,无需redis // 进行机密 提交的字符串必须使用sha256 进行加密
e.~* // 允许访问的键名 ~ 允许访问的键名 键的名匹配模式 *
// redis 7.0 以上的版本还可以详细区分读写权限
// %RW~键名匹配模式
f.&* // redis 在作为消息队列使用时,可以进行消息队列的建立和发布
// 建立不同的消息队列时,会使用publish发布频道 和
// scribe 命令实现订阅频道
// & 限制对于频道的订阅
// &频道名称的匹配模式
// &* 开放所有的channel(频道)
g.+@all // 授权命令,
// +命令1|子命令或者参数…… 授权用户可以使用
// -命令1|子命令 或者参数…… 禁止用户使用的命令
// @all 代表所有的指令
(6)创建用户以及设置用户权限
acl setuser
acl load 文件名
acl list 以acl文件格式列出用户信息
acl getuser 用户名 已较有条理的方式列出用户的基本信息
acl deluser 用户名 删除用户
acl whoami 查看当前登录用户
acl users 列出所有用户
acl save 将当前的用户配置保存到ACL文件
127.0.0.1:6379> ACL SETUSER alice
OK
127.0.0.1:6379> acl list
1) "user alice off &* -@all"
alice 用户账号未启用 没有授权任何键和命令的使用 但是可以访问所有的频道 redis不同版本用户的初始化设定不同
启用用户,并给用户设定对应的权限
127.0.0.1:6379> ACL SETUSER alice on // 启用用户
OK
127.0.0.1:6379> acl list
1) "user alice on &* -@all"
2) "user default on nopass ~* &* +@all"
127.0.0.1:6379> ACL SETUSER alice >redhat // 设置密码
OK
127.0.0.1:6379> ACL LIST
1) "user alice on #7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097 &* -@all"
2) "user default on nopass ~* &* +@all"
127.0.0.1:6379> ACL SETUSER alice -@all +set +get //授权命令
OK
127.0.0.1:6379> ACL GETUSER alice
1) "flags"
2) 1) "on"
2) "allkeys"
3) "allchannels"
3) "passwords"
4) 1) "7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097"
5) "commands"
6) "-@all +get +set"
7) "keys"
8) 1) "*"
9) "channels"
10) 1) "*"
127.0.0.1:6379> auth alice redhat
OK
127.0.0.1:6379> get eee
"5555"
127.0.0.1:6379> set alice newuser
OK
127.0.0.1:6379> get alice
"newuser"
127.0.0.1:6379> del alice // 这里删除键 缺少权限
(error) NOPERM this user has no permissions to run the 'del' command or its subcommand
127.0.0.1:6379> ACL SETUSER alice +@string
OK
127.0.0.1:6379> ACL SETUSER default >redhat
OK
127.0.0.1:6379> acl list
1) "user alice on #7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097 ~* &* -@all +@string"
2) "user default on #7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097 ~* &* +@all"
127.0.0.1:6379> auth alice redhat
OK
127.0.0.1:6379> set a_kay asfsdfa
OK
127.0.0.1:6379> get a_key
(nil)
127.0.0.1:6379> mset b_ksy asdasfa c_key sdfdsfs
OK
127.0.0.1:6379> mget a_key b_key c_key
1) (nil)
2) (nil)
3) "sdfdsfs"
127.0.0.1:6379> mget a_kay b_ksy c_key
1) "asfsdfa"
2) "asdasfa"
3) "sdfdsfs"
127.0.0.1:6379> auth default redhat //使用auth 可以直接在不同用户之间切换
OK
127.0.0.1:6379> acl list
1) "user alice on #7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097 ~* &* -@all +@string"
2) "user default on #7d3b5c83009fadf734c06eeecd7fbe256c69f71c8ba0429e4d7ad5f54b2e4097 ~* &* +@all"
在为用户设置密码后,登录redis库的操作方法:
[root@bogon ~]# redis-cli --user default --pass redhat // 使用明文密码
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> exit
[root@bogon ~]# redis-cli --user default --askpass // 不显示明文密码
Please input password: ******
127.0.0.1:6379> exit
[root@bogon ~]# redis-cli // 连接redis服务器之后再登录
127.0.0.1:6379> auth default redhat
OK