Python And Redis

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. 发布和订阅功能: 聊天软件

redismemcached比较

memcachedredis
类型纯内存数据管理系统内存磁盘同步数据库
数据类型在定义value时固定类型不需要
虚拟内存不支持支持
过期策略支持支持
存储数据安全不支持可以将数据同步导dump.db中
灾难恢复不支持可以从磁盘数据库中恢复到内存中
分布式支持主从同步
订阅与发布不支持支持

安装与连接(Ubuntu 16.1)

  1. 安装
sudo apt install redis-server
  1. 卸载
sudo apt purge --auto-remove redis-server
  1. 启动, redis默认启动, 可以通过命令查看
ps aux|grep redis
手动启动
```shell
sudo service redis start
```

redis-cli命令操作数据库

  1. 连接
redis-cli -p[端口] -h[ip]
  1. 添加键值对
set username[key] daye[value]
get username[key]
  1. 删除
del username[key]
  1. 过期时间
expires key timeout()

也可以在设置值, 一同设置过期时间
set key value EX timeout setex key timeout value
查看过期时间

ttl username[key]
  1. 查看所有键
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`: 子键的值
  • 获取hashfield的值
hget person[key] name[field]
  • 获取hash中key对应的所有fieldvalue
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]

事务操作

  • 隔离操作: 事务中的所有命令都要序列化, 按照顺序执行, 不会被其他命令打扰
  • 原子操作: 事务中的命令要么全部执行, 要么全部不执行
  1. 进入事务
multi
  1. 执行事务
exec
  1. 取消事务
discard
  1. 监视key
watch name[key]

监听一个key, 如果key发生改变, 则事务不会进行
取消监听

unwatch name[key]

发布与订阅

像看门狗一样, 轮询订阅的频道是否有新的消息发布

  • 给某个频道发布消息
publish chatrom[Chanel] "Hello Wrold"[message]  
  • 订阅某个频道 也可以定义多个频道
subscribe chatrom[Chanel]

同步机制

redis提供了二个备份策略: RDBADF

RDBAOF
开启关闭开启: 默认开启. 关闭: 把配置文件中所有的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>
    原文作者:小混混_f0f2
    原文地址: https://www.jianshu.com/p/383245d3fcc7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞