redis的使用

一、简介

1.1 概念

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

1.2 使用场景

  • 登录会话存储,存储在redis中,与memcached相比,数据不会丢失
  • 排行版、计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数。
  • 作为消息队列:比如celery就是redis作为中间人
  • 当前在线人数:显示有多少在线人数
  • 一些常用的数据缓存:比如BBS论坛,模块不会经常变化,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
  • 把前200篇文章或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
  • 好友关系:微博的好友关系使用redis实现
  • 发布和订阅功能:可以用来做聊天软件

二、对redis的操作

2.1 字符串操作(string)

(1)添加

将字符串值value关联到key。如果key已经存在值,set命令会覆盖之前的值。默认的过期时间是永久。

set key value

(2)设置键值及过期时间,以秒为单位

setex key seconds value

(3)设置多个键值

mset key1 value1 key2 value2 ...

(4)追加值

append key value

(5)获取

get key

(6)获取多个键获取多个值

mget key1 key2 ...

(7)删除

del username

 2.2 键key操作

(1)查看所有键

keys *

(2)查看名称中包含a的键

keys 'a*'

(3)判断键是否存在,如果存在返回1,不存在返回0

exists key1

(4)删除键及对应的值

del key1 key2 .

(5)设置过期时间,以秒为单位

expire key seconds

(6)查看有效时间,以秒为单位

ttl key

2.2 哈希操作(hash)

(1)设置单个属性

hset key field value

(2)设置多个属性

hmset key field1 value1 field2 value2 ..

(3)获取指定键所有的属性

hkeys key

(4)获取⼀个属性的值

hget key field

(5)获取多个属性的值

hmget key field1 field2 

(6)获取所有属性的值

hvals key

(7)删除整个hash键及值,使⽤del命令

hdel key field1 field2 ...

2.3 列表操作(list)

(1)在左侧插⼊数据

lpush key value1 value2 ...

(2)在右侧插⼊数据

rpush key value1 value2 ...

(3)在指定元素的前或后插⼊新元素

linsert key before或after 现有元素 新元素

(4)返回列表⾥指定范围内的元素

  • start、stop为元素的下标索引
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange key start stop

(5)设置指定索引位置的元素值

  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset key index value

(6)删除指定元素

  • 将列表中前count次出现的值为value的元素移除
  • count > 0: 从头往尾移除
  • count < 0: 从尾往头移除
  • count = 0: 移除所有
lrem key count value

2.4 集合操作(set)

说明:对于集合没有修改操作

(1)添加元素

sadd key member1 member2 ...

(2)获取所有的元素

smembers key

(3)删除指定元素

srem key

2.5 zset类型

  • sorted set,有序集合
  • 元素为string类型
  • 元素具有唯⼀性,不重复
  • 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
  • 说明:没有修改操作

(1)添加

zadd key score1 member1 score2 member2 ...

(2)获取

  • 返回指定范围内的元素
  • start、stop为元素的下标索引
  • 索引从左侧开始,第⼀个元素为0
  • 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素

zrange key start stop

(3)返回score值在min和max之间的成员

zrangebyscore key min max

(4)返回成员member的score值

zscore key member

(5)删除指定元素

zrem key member1 member2 ...

(6)删除权重在指定范围的元素

zremrangebyscore key min max

2.6 事物操作

redis事务可以一次执行多个命令,事务具有以下特征:

  • 隔离操作:事务中的所有命令都会序列化,按顺序执行,不会被其它命令打扰。
  • 原子操作:事务中的命令要么全部被执行,要么全部不执行。

(1)开启一个事务

multi

以后执行的所有命令,都将在这个事务中执行。

(2)执行事务

exec

会将在multi和exec中的操作一并提交

(3)取消事务

discard

会将multi后的所有命令取消

(4)监视一个或者多个key

watch key .......

监视一个或多个key,如果在事务执行之前这个key被其它命令所改动,那么事务将被打断。

(5)取消所有key的监视

unwatch

三、RDB和AOF的两种数据持久化机制

RDB同步机制

  • 开启和关闭:默认情况下是开启了,如果想关闭,那么注释掉“redis.conf”文件中的所有“safe”选项就可以了
  • 同步机制:save 900 1 如果在900s以内发生了一次数据跟新操作,那么就会做一次同步操作;还有两种机制:save 300 10;  save 60 10000
  • 存储内容:存储的是具体的值,并且是经过压缩后存储进去的。
  • 存储路径:根据“redis.conf”下的dir以及‘rdbfilename’来制定的,默认是 /var/lib/redis/dump.rdb
  • 优点:1.存储数据到文件中会进行压缩,文件体积比AOF小;2.因为存储的是redis具体的值,并且经过压缩,因此在回复的时候速度比AOF快;3.非常实用于备份。
  •  缺点:1.RDB在多少时间内发生了多少写操作的时候就会触发同步机制,因为采用压缩机制,RDB在同步的时候都重新保存整个redis中的数据,因此一般会设置在最少5分钟才保存一次数据。在这种情况下,一单服务器故障,会造成5分钟的数据丢失

 AOF同步机制

  • 开启和关闭:默认是关闭的。如果想开启,那么修改redis.conf中的‘appendonly yes’ 就可以了
  • 同步机制:1.appendfsync always:每次有数据更新操作,都会同步到文件中;2.appendfsync everysec:每秒进行一次更新;3.appendfsync no:30s更新一次(采用默认的)
  • 存储内容:存储的是具体的命令,不会进行压缩。
  • 存储路径:根据redis.conf下的dir以及appendfilename来指定的。默认是 /var/lib/redis/appendonly.aof
  • 优点:1.AOF的策略是每秒钟或者每次发生写操作的时候都会同步,因此即使服务器故障,最对只会丢失1秒的数据;2.AOF存储的是redis的命令,并且是直接追加到aof文件后面,因此每次备份的时候只要添加新的数据进去就可以了。3.如果AOF文件比较大了,那么redis会进行重写,只保留最小的命令集合。
  • 缺点:1.AOF文件因为没有压缩,因此体积比AOF大;2.AOF是在每秒或者每次写操作都进行备份,因此如果并发量比较大,效率可能有点慢;3,AOF文件因为存储的是命令,因此在灾难恢复的时候redis会重新运行AOF中的命令,速度不及RDB。

四、设置redis的连接密码

(1)设置密码

  vim /etc/redis.conf 

打开配置文件,然后按“/”搜索“requirepass”,再按‘n’找到‘requirepass xxxxx’,取消注释,在后面加上要设置的密码 requirepass 123456.

(2)本地连接

redis-cli -p 6379 -h 127.0.0.1 -a 123456

可以在连接的时候,通过‘-a’参数指定密码进行连接,也可以先登录上去,然后再使用‘auth password’命令进行授权。

 (3)其它机器连接redis

 如果想让其它机器连接本机的redis服务器,那么应该在‘redis.conf’配置文件中,指定“bind 本机的ip地址”,这样别的机器就能连接成功了。

vim /etc/redis.conf

按‘/’搜索‘bind’,后面指定自己机器的ip

五、Python操作redis

(1)安装

pip install redis

(2)连接

from redis import Redis

cache = Redis(host="139.199.131.146",port=6379,password=123456)

(3)字符串操作

cache.set('uers','derek')

cache.get('users')

cache.delete('users')

(4)列表操作

cache.lpush('users','tom')

print(cache.lrange('users',0,-1))

(5)集合的操作

cache.sadd('group','CEO')

print(cache.smembers('group'))

(6)哈希的操作

cache.hset('person','name','derek')

print('cache.hgetall('person')')

(7)事务的操作

pip = cache.pipeline()
pip.set('username','derek')
pip.set('password','123456')
pip.execute()

django存储session

  • 之前django的session默认是存在的数据库里面的,我们也可以把session存储在redis里面
pip install django-redis-sessions==0.5.6
SESSION_ENGINE = 'redis_sessions.session'
SESSION_REDIS_HOST = 'localhost'
SESSION_REDIS_PORT = 6379
SESSION_REDIS_DB = 2
SESSION_REDIS_PASSWORD = ''
SESSION_REDIS_PREFIX = 'session'
原文地址:https://www.cnblogs.com/linyuhong/p/10099556.html