redis
概述
redis
是一种mysql
非关系型数据库,它是由ANSI C
编写, 数据保存在内存中, 同时也按照备份策略同步到磁盘, 所以既有着mysql
的数据持久化, 也有着memcached
的高效率.
redis
也支持更多的数据结构(string, list(列表, 队列, 栈), set(集合), sorted sort, hash(hash表))
使用场景
- 登入会话储存, 存储在
redis
中, 与memcached
相比, 数据不会丢失 - 排行版/计算器: 各种排行信号, 文章的阅读量, 点赞信息
- 消息队列: 比如
celery
使用redis
作为中间人 - 当前在线人数: 显示当前系统在线人数
- 一些常用的数据缓存: 板块信息
- 热门文章(帖子)或者评论缓存: 一般用户浏览网站, 只会浏览前面的文章和评论, 那么可以将他们缓存起来, 提高访问效率
用户访问超过的, 就去访问数据库, 并且新发布的文章会把旧的文章删除 - 好友关系: 微博的好友
- 发布和订阅功能: 聊天软件
redis
和memcached
比较
memcached | redis | |
---|---|---|
类型 | 纯内存数据管理系统 | 内存磁盘同步数据库 |
数据类型 | 在定义value时固定类型 | 不需要 |
虚拟内存 | 不支持 | 支持 |
过期策略 | 支持 | 支持 |
存储数据安全 | 不支持 | 可以将数据同步导dump.db中 |
灾难恢复 | 不支持 | 可以从磁盘数据库中恢复到内存中 |
分布式 | 支持 | 主从同步 |
订阅与发布 | 不支持 | 支持 |
安装与连接(Ubuntu 16.1)
- 安装
sudo apt install redis-server
- 卸载
sudo apt purge --auto-remove redis-server
- 启动,
redis
默认启动, 可以通过命令查看
ps aux|grep redis
手动启动
```shell
sudo service redis start
```
redis-cli
命令操作数据库
- 连接
redis-cli -p[端口] -h[ip]
- 添加键值对
set username[key] daye[value]
get username[key]
- 删除
del username[key]
- 过期时间
expires key timeout()
也可以在设置值, 一同设置过期时间
set key value EX timeout setex key timeout value
查看过期时间
ttl username[key]
- 查看所有键
key *
操作value中列表
- 在列表左边添加:
websites www.baidu.com
将value
插入列表表头, 如果key
不存在, 创建一个空列表并执行lpush
操作; 如果key
存在但不是列表类型, 就会报错
- 查看列表
lrange websites[key] 0[start] -1[stop]
返回列表指定[start
, ‘stop’]的元素, [0, -1]就是列表中全部元素
- 移除列表元素
- 移除并返回列表
value
的尾元素
rpop websites[key]
- 移除并返回列表
value
的头元素
lpop websites[key]
- 移除并返回列表的中间元素
lrem websites[key] 1[count] www.baidu.com[value]
* `count`, 列表中可能存在重复的元素, 通过`count`参数传入要删除的个数 * `count` > 0: 从表头开始 * `count` < 0: 从表尾开始 * `count` = 0: 将列表中的`value`元素全部删除
- 移除并返回列表
- 返回指定的元素
lindex websites 1[index]
- 返回列表元素个数
llen websites[key]
操作value中集合
- 添加元素
sadd school1[key] beida qinghua xian
- 查看元素
smembers school1[set]
- 移除元素
srem school1[set] xian[member]
- 查看元素的个数
scard school1[set]
- 获得多个集合的交集
sadd school2 beida jiaoda dezou
sinter school1[set] school2[set]
- 获得多个集合的并集
sunion school school2
- 多个集合的差集
sdiff school1 school2
hash
的操作
- 添加一个值
hset person[key] name[field] DaYe[value]
* `key`: 主键的名称
* `field`: 子键名称
* `value`: 子键的值
- 获取
hash
中field
的值
hget person[key] name[field]
- 获取hash中
key
对应的所有field
和value
hgetall person[key]
- 获取hash中
key
对应的value
hvals person[key]
- 获取hash中
key
对应的所有field
hkeys person[key]
* 删除key
的某个field
hdel person[key] name[field]
- 判断
hash
是否存在field
hexits person[key] name[field]
事务操作
- 隔离操作: 事务中的所有命令都要序列化, 按照顺序执行, 不会被其他命令打扰
- 原子操作: 事务中的命令要么全部执行, 要么全部不执行
- 进入事务
multi
- 执行事务
exec
- 取消事务
discard
- 监视
key
watch name[key]
监听一个key
, 如果key
发生改变, 则事务不会进行
取消监听
unwatch name[key]
发布与订阅
像看门狗一样, 轮询订阅的频道是否有新的消息发布
- 给某个频道发布消息
publish chatrom[Chanel] "Hello Wrold"[message]
- 订阅某个频道 也可以定义多个频道
subscribe chatrom[Chanel]
同步机制
redis
提供了二个备份策略: RDB
和 ADF
RDB | AOF | |
---|---|---|
开启关闭 | 开启: 默认开启. 关闭: 把配置文件中所有的save注释 | 开启: 在配置文件中appendonly=yes 既开启了AOF ,为no 关闭 |
同步机制 | 可以指定某个时间内发生多少个命令进行同步 | 每秒同步或者每次发生命令同步 |
储存内容 | redis 具体的键和值 | 执行的写操作命令 |
存储路径 | 根据dir 以及dbfilename 来指定路径和文件名 | 根据dir 以及appendfilename 来指定路径和文件名 |
优点 | 1. 存储数据到文件会进行压缩, 文件体积较小 </br>2. 因为储存是具体的值,所以回复速度会比AOF 更快 3. 非常适用于备份 | 1.AOF 的策略是同步命令, 即使服务器故障, 也只是会丢失1秒的数据 2. AOF 存储命令并并直接追加到AOF 文件后面, 因此每次备份只需要添加数据即可. 3. 如果文件比较大, 那么Redis 将会进行重写, 只保留最小的命令集合 |
缺点 | 1. ROB在时间段内触发同步机制, 采用压缩机制, RDB重新保存数据库数据, ==一般设置五分钟备份一次== 2. 数据存入RDB , redis 会自动fork一个子进程用来同步, 当同步量大时, 可能会非常耗时 | 1. AOF 文件相比较大, 2.并发大时, 效率可能会很低, 3. 由于备份的是命令, 所以恢复速度远不及RDB |
RDB
首先进入redis
的配置文件/etc/redis/redis.conf
, 找到与RDB
有关的配置
save 900 1
save 300 10
save 60 10000
dir /var/bin/redis
dbfillename dump.rdb`
-
dir
+dbfilename
决定了RDB
策略的备份文件路径和文件名 -
seve 900 1
每900秒发生1次写操作备份一次 -
seve 300 1
每300秒发生1次写操作备份一次 -
seve 60 1
每60秒发生1次写操作备份一次
AOF
再次进入redis
配置文件查找与AOF
有关的配置
appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
-
appendonly
, 控制AOF的启用, 默认为no
-
appendfilename
, 备份的文件名 与dir
构成, 默认是/var/bin/appendonly.aof
-
appendsync
控制备份方式- always: 每次数据更新
-
everysec
: 每秒备份一次,AOF
默认备份方式 -
no
: 遵循系统的备份方式, 一般都是每个三十秒备份一次
注意: 由于默认不开启AOF
, 开启后,AOF
会自动将当前的键值对进行备份, 然后才会按照备份策略(appendsync
配置)备份命令
redis
密码与授权
- 设置密码
- 在
redis.cof
配置文件中, 将requirepass password[password]
取消注释, 并指定你的密码, 需要重启后生效 - 有一种不需要重启的方法,
config set requirepass password[password]
- 在
- 使用密码连接redis
- 连接时使用
-a
参数指定密码进行连接 - 也可以先登入之后, 使用
auth password[password]
命令进行授权
- 连接时使用
允许其他ip连接redis
默认只能本机连接, 需要允许其他ip连接本机redis
, 则需要修改配置文件
bind 127.0.0.1 192.168.1.1 // 本机的ip地址, 有待考证
用python操作redis
- 安装
python-redis
sudo pip3 install redis
to-do list
- [x]
redis
原生操作和配置介绍 2018/05/10 - [x]
redis
备份策略介绍 - [ ] 使用
python
操作redis
- [ ] 使用
Java
操作redis
<center>喂完待续..</center>