|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
## redis
### 概述
`redis`是一种`mysql`非关系型数据库,它是由`ANSI C`编写, 数据保存在内存中, 同时也按照备份策略同步到磁盘, 所以既有着`mysql`的数据持久化, 也有着`memcached`的高效率.
`redis`也支持更多的数据结构(string, list(列表, 队列, 栈), set(集合), sorted sort, hash(hash表))
### 使用场景
1. 登入会话储存, 存储在`redis`中, 与`memcached`相比, 数据不会丢失
2. 排行版/计算器: 各种排行信号, 文章的阅读量, 点赞信息
3. 消息队列: 比如`celery`使用`redis`作为中间人
4. 当前在线人数: 显示当前系统在线人数
5. 一些常用的数据缓存: 板块信息
6. 热门文章(帖子)或者评论缓存: 一般用户浏览网站, 只会浏览前面的文章和评论, 那么可以将他们缓存起来, 提高访问效率
用户访问超过的, 就去访问数据库, 并且新发布的文章会把旧的文章删除
7. 好友关系: 微博的好友
8. 发布和订阅功能: 聊天软件
#### `redis`和`memcached`比较
| | memcached | redis |
|:------------ |:--------------------- |:------------------------------ |
| 类型 | 纯内存数据管理系统 | 内存磁盘同步数据库 |
| 数据类型 | 在定义value时固定类型 | 不需要 |
| 虚拟内存 | 不支持 | 支持 |
| 过期策略 | 支持 | 支持 |
| 存储数据安全 | 不支持 | 可以将数据同步导dump.db中 |
| 灾难恢复 | 不支持 | 可以从磁盘数据库中恢复到内存中 |
| 分布式 | 支持 | 主从同步 |
| 订阅与发布 | 不支持 | 支持 |
### 安装与连接(Ubuntu 16.1)
1. 安装
```shell
sudo apt install redis-server
```
2. 卸载
```shell
sudo apt purge --auto-remove redis-server
```
3. 启动, `redis`默认启动, 可以通过命令查看
```shell
ps aux|grep redis
```
手动启动
```shell
sudo service redis start
```
### `redis-cli`命令操作数据库
1. 连接
```shell
redis-cli -p[端口] -h[ip]
```
2. 添加键值对
```shell
set username[key] daye[value]
get username[key]
```
3. 删除
```shell
del username[key]
```
4. 过期时间
```shell
expires key timeout()
```
也可以在设置值, 一同设置过期时间
```
set key value EX timeout
setex key timeout value
```
查看过期时间
```shell
ttl username[key]
```
5. 查看所有键
```
key *
```
### 操作value中列表
* 在列表左边添加:
```shell
websites www.baidu.com
```
将`value`插入列表表头, 如果`key`不存在, 创建一个空列表并执行`lpush`操作; 如果`key`存在但不是列表类型, 就会报错
* 查看列表
```shell
lrange websites[key] 0[start] -1[stop]
```
返回列表指定[`start`, 'stop']的元素, [0, -1]就是列表中全部元素
* 移除列表元素
* 移除并返回列表`value`的尾元素
```shell
rpop websites[key]
```
* 移除并返回列表`value`的头元素
```shell
lpop websites[key]
```
* 移除并返回列表的中间元素
```shell
lrem websites[key] 1[count] www.baidu.com[value]
```
* `count`, 列表中可能存在重复的元素, 通过`count`参数传入要删除的个数
* `count` > 0: 从表头开始
* `count` < 0: 从表尾开始
* `count` = 0: 将列表中的`value`元素全部删除
* 返回指定的元素
```shell
lindex websites 1[index]
```
* 返回列表元素个数
```shell
llen websites[key]
```
### 操作value中集合
* 添加元素
```shell
sadd school1[key] beida qinghua xian
```
* 查看元素
```shell
smembers school1[set]
```
* 移除元素
```shell
srem school1[set] xian[member]
```
* 查看元素的个数
```shell
scard school1[set]
```
* 获得多个集合的交集
```shell
sadd school2 beida jiaoda dezou
sinter school1[set] school2[set]
```
* 获得多个集合的并集
```shell
sunion school school2
```
* 多个集合的差集
```shell
sdiff school1 school2
```
### `hash`的操作
* 添加一个值
```shell
hset person[key] name[field] DaYe[value]
```
* `key`: 主键的名称
* `field`: 子键名称
* `value`: 子键的值
* 获取`hash`中 `field`的值
```shell
hget person[key] name[field]
```
* 获取hash中`key`对应的所有`field`和`value`
```shell
hgetall person[key]
```
* 获取hash中`key`对应的`value`
```shell
hvals person[key]
```
* 获取hash中`key`对应的所有`field`
```shell
hkeys person[key]
```
* 删除`key`的某个`field`
```shell
hdel person[key] name[field]
```
* 判断`hash`是否存在`field`
```redis
hexits person[key] name[field]
```
### 事务操作
* 隔离操作: 事务中的所有命令都要序列化, 按照顺序执行, 不会被其他命令打扰
* 原子操作: 事务中的命令要么全部执行, 要么全部不执行
1. 进入事务
```shell
multi
```
2. 执行事务
```shell
exec
```
3. 取消事务
```shell
discard
```
4. 监视`key`
```shell
watch name[key]
```
监听一个`key`, 如果`key`发生改变, 则事务不会进行
取消监听
```shell
unwatch name[key]
```
### 发布与订阅
像看门狗一样, 轮询订阅的频道是否有新的消息发布
* 给某个频道发布消息
```shell
publish chatrom[Chanel] "Hello Wrold"[message]
```
* 订阅某个频道 也可以定义多个频道
```shell
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`, 则需要修改配置文件
```shell
bind 127.0.0.1 192.168.1.1 // 本机的ip地址, 有待考证
```
### 用python操作redis
* 安装`python-redis`
```shell
sudo pip3 install redis
```
to-do list
- [x] `redis`原生操作和配置介绍 2018/05/10
- [x] `redis`备份策略介绍
- [ ] 使用`python`操作`redis`
- [ ] 使用`Java`操作`redis`
<center>喂完待续..</center>
|
|