鱼C论坛

 找回密码
 立即注册
查看: 1379|回复: 19

[技术交流] Python和redis

[复制链接]
回帖奖励 30 鱼币 回复本帖可获得 10 鱼币奖励! 每人限 1 次(中奖概率 10%)
发表于 2018-8-13 22:54:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-8-13 22:55:42 | 显示全部楼层
第一
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-14 14:38:32 | 显示全部楼层
介绍的好突兀,还是习惯通俗易懂的方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 14:48:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-15 13:01:29 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-15 13:02:07 | 显示全部楼层

回帖奖励 +10 鱼币

感觉不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-6 22:07:55 | 显示全部楼层

回帖奖励 +10 鱼币

666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-7 05:20:03 | 显示全部楼层

回帖奖励 +10 鱼币

不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-7 11:22:26 | 显示全部楼层
天书一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 10:05:06 | 显示全部楼层
看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-24 16:31:11 | 显示全部楼层

回帖奖励 +10 鱼币

厉害厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 14:36:32 | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-21 15:47:49 From FishC Mobile | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 13:07:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 13:34:59 | 显示全部楼层
不错的帖子,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 13:35:35 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-10 13:36:45 | 显示全部楼层
手气怎么这么差
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-10 14:34:06 | 显示全部楼层
python真香
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 09:48:06 | 显示全部楼层
强啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-25 12:39:46 | 显示全部楼层
我还没这个。MYSQL 学了一点点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表