Redis键值对数据库

Redis键值对数据库

Redis概述和使用场景介绍

概述redis 是一种 nosql 数据库,他的数据是保存在内存中,同时 redis 可以定时把内存数据同步到 磁盘,即可以将数据持久化
支持更多的数据结构( string , list列表[队列和 栈] , set[集合] , sorted set[有序集合] , hash(hash表) )。
相关参考文 档:http://redisdoc.com/index.html redis

使用场景:

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

在这里插入图片描述

Redis的安装以及客户端连接

  1. 安装:
sudo apt-get install redis-server 
  1. 卸载:
sudo apt-get purge --auto-remove redis-server 
  1. 启动: redis 安装后,默认会自动启动,可以通过以下命令查看: ps aux|grep redis 如果想自己手动启动,可以通过以下命令进行启动:
sudo service redis-server start 
  1. 停止:
sudo service redis-server stop

Redis的字符串以及过期时间操作

对 redis 的操作可以用两种方式,
第一种方式采用 redis-cli ,
第二种方式采用编程语言,比 如 Python 、 PHP 和 JAVA 等。

  1. 使用 redis-cli 对 redis 进行字符串操作:
  2. 启动 redis :
sudo service redis-server start 
  1. 连接上 redis-server :
redis-cli -h [ip] -p [端口] 
  1. 添加:
set key value 
如:
set username xiaotuo

将字符串值 value 关联到 key 。如果 key 已经持有其他值, set 命令就覆写旧值,无视其 类型。并且默认的过期时间是永久,即永远不会过期。
10. 删除:

del key 
如:
del username 
  1. 设置过期时间:
 expire key timeout(单位为秒) 

也可以在设置值的时候,一同指定过期时间:

  set key value EX timeout 
  或:
  setex key timeout value 
  1. 查看过期时间:
 ttl key 
 如:
 ttl username 
  1. 查看当前 redis 中的所有 key :
keys *

Redis列表操作

在列表左边添加元素:

 lpush key value 

将值 value 插入到列表 key 的表头。如果 key 不存在,一个空列表会被创建并执 行 lpush 操作。当 key 存在但不是列表类型时,将返回一个错误。
在列表右边添加元素:

   rpush key value

将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操 作。当key存在但不是列表类型时,返回一个错误。
查看列表中的元素:

   lrange key start stop 

返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定,如果要左边的第 一个到最后的一个 lrange key 0 -1 。
移除列表中的元素:
移除并返回列表 key 的头元素:

lpop key 

移除并返回列表的尾元素:

  rpop key 
  

移除并返回列表 key 的中间元素:

  lrem key count value 

将删除 key 这个列表中, count 个值为 value 的元素。
指定返回第几个元素:

  lindex key index 

将返回 key 这个列表中,索引为 index 的这个元素。
获取列表中的元素个数:

llen key 
如:
llen languages 
    

删除指定的元素:

 lrem key count value 
 如:
 lrem languages 0 php

根据参数 count 的值,移除列表中与参数 value 相等的元素。 count 的值可以是以下几 种:

  1. count > 0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
  2. count < 0:从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝 对值。
  3. count = 0:移除表中所有与 value 相等的值。

Redis集合操作

添加元素:

sadd set value1 value2.... 
如:
sadd team xiaotuo datuo 

查看元素:

smembeers set 
如:
smembers team 

移除元素:

srem set member... 
如:
srem team xiaotuo datuo 

查看集合中的元素个数:

scard set 
如:
scard team1 

获取多个集合的交集:

sinter set1 set2 
如:
sinter team1 team2 

获取多个集合的并集:

sunion set1 set2 
如:
sunion team1 team2 

获取多个集合的差集:

sdiff set1 set2 
如:
sdiff team1 team2

Redis的哈希操作

添加一个新值:

hset key field value 
如:
hset website baidu baidu.com 

将哈希表 key 中的域 field 的值设为 value 。
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于 哈希表中,旧值将被覆盖。
获取哈希中的 field 对应的值:

hget key field 
如:
hget website baidu 

删除 field 中的某个 field :

hdel key field 
如:
hdel website baidu 

获取某个哈希中所有的 field 和 value :

hgetall key 
如:
hgetall website 

获取某个哈希中所有的 field :

hkeys key 
如:
hkeys website 

获取某个哈希中所有的值:

hvals key
如:
hvals website

判断哈希中是否存在某个 field :

hexists key field 
如:
hexists website baidu 

获取哈希中总共的键值对:

 hlen field 
 如:
 hlen website

Redis的事务操作

事务操作:Redis事务可以一次执行多个命令,事务具有以下特征:
隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。
原子操作:事务中的命令要么全部被执行,要么全部都不执行。
开启一个事务:

multi 

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

exec 

会将在 multi 和 exec 中的操作一并提交。
取消事务:

discard 

会将 multi 后的所有命令取消。
监视一个或者多个 key :

 watch key... 

监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事 务将被打断。
取消所有 key 的监视:

 unwatch

Redis的发布和订阅操作

发布/订阅操作:
给某个频道发布消息:

  publish channel message 

订阅某个频道的消息:

   subscribe channel

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

持久化: redis 提供了两种数据备份方式,一种是 RDB ,另外一种是 AOF ,以下将详细介绍
这两种备份策略: | | RDB | AOF | | — | — | — | | 开启关闭 | 开启:默认开启。
关闭:把配置文件中所有的save 都注释,就是关闭了。
| 开启:在配置文件中 appendonly yes 即开启了 aof ,为 no 关闭。
| | 同步机制 | 可以指定某个时间内发生多少个命令进行同步。比如1分钟内发生了2次命令,就 做一次同步。
| 每秒同步或者每次发生命令后同步 | |
存储内容
| 存储的是redis里面的具体的 值| 存储的是执行的更新数据的操作命令
| | 存储文件的路径
| 根据dir以及dbfilename来指定路 径和具体的文件名
| 根据dir以及appendfilename来指定具体的路径和文件名
| | 优点 |
(1)存 储数据到文件中会进行压缩,文件体积比aof小。
(2)因为存储的是redis具体的值,并且会 经过压缩,因此在恢复的时候速度比AOF快。
(3)非常适用于备份。
|
(1)AOF的策略是每 秒钟或者每次发生写操作的时候都会同步,因此即使服务器故障,最多只会丢失1秒的数据。
(2)AOF存储的是Redis命令,并且是直接追加到aof文件后面,因此每次备份的时候只要添 加新的数据进去就可以了。
(3)如果AOF文件比较大了,那么Redis会进行重写,只保留最 小的命令集合。
| | 缺点 |
(1)RDB在多少时间内发生了多少写操作的时候就会出发同步机 制,因为采用压缩机制,RDB在同步的时候都重新保存整个Redis中的数据,因此你一般会设 置在最少5分钟才保存一次数据。在这种情况下,一旦服务器故障,会造成5分钟的数据丢 失。
(2)在数据保存进RDB的时候,Redis会fork出一个子进程用来同步,在数据量比较大的 时候,可能会非常耗时。 |
(1)AOF文件因为没有压缩,因此体积比RDB大。
(2)AOF是 在每秒或者每次写操作都进行备份,因此如果并发量比较大,效率可能有点慢。
(3)AOF文 件因为存储的是命令,因此在灾难恢复的时候Redis会重新运行AOF中的命令,速度不及 RDB。
| | 更多 | http://redisdoc.com/topic/persistence.html#redis | |

Redis设置连接密码

安全:在配置文件中,设置 requirepass password ,那么客户端连接的时候,需要使用密码:

redis-cli -p 127.0.0.1 -p 6379
redis> set username xxx
(error) NOAUTH Authentication required.
redis> auth password
redis> set username xxx
OK

其他机器连接本机redis

Python操作redis

1. 安装 python-redis :

pip install redis 
  1. 新建一个文件比如 redis_test.py ,然后初始化一个 redis 实例变量,并且在 ubuntu 虚拟 机中开启 redis 。比如虚拟机的 ip 地址为 192.168.174.130 。示例代码如下:
  # 从redis包中导入Redis类 
  from redis import Redis 
  # 初始化redis实例变量 
  xtredis = Redis(host='192.168.174.130',port=6379) 
  1. 对字符串的操作:操作 redis 的方法名称,跟之前使用 redis-cli 一样,现就一些常用的来 做个简单介绍,示例代码如下(承接以上的代码):
# 添加一个值进去,并且设置过期时间为60秒,如果不设置,则永远不会过期 
xtredis.set('username','xiaotuo',ex=60) 
# 获取一个值 
xtredis.get('username') 
# 删除一个值 
xtredis.delete('username') 
# 给某个值自增1 
xtredis.set('read_count',1) xtredis.incr('read_count') 
# 这时候read_count变为2 
# 给某个值减少1
xtredis.decr('read_count') # 这时候read_count变为1 
  1. 对列表的操作:同字符串操作,所有方法的名称跟使用 redis-cli 操作是一样的:
# 给languages这个列表往左边添加一个python 
xtredis.lpush('languages','python') 
# 给languages这个列表往左边添加一个php 
xtredis.lpush('languages','php') 
# 给languages这个列表往左边添加一个javascript 
xtredis.lpush('languages','javascript') 
# 获取languages这个列表中的所有值 
print xtredis.lrange('languages',0,-1) 
> ['javascript','php','python']
  1. 对集合的操作:
# 给集合team添加一个元素
xiaotuo xtredis.sadd('team','xiaotuo') 
# 给集合team添加一个元素datuo 
xtredis.sadd('team','datuo') 
# 给集合team添加一个元素slice 
xtredis.sadd('team','slice') 
# 获取集合中的所有元素 
xtredis.smembers('team') 
> ['datuo','xiaotuo','slice'] # 无序的 
  1. 对哈希( hash )的操作:
# 给website这个哈希中添加baidu 
xtredis.hset('website','baidu','baidu.com') 
# 给website这个哈希中添加google 
xtredis.hset('website','google','google.com') 
# 获取website这个哈希中的所有值 
print xtredis.hgetall('website')
> {"baidu":"baidu.com","google":"google.com"}
  1. 事务(管道)操作: redis 支持事务操作,也即一些操作只有统一完成,才能算完成。否则都执 行失败,用 python 操作 redis 也是非常简单,示例代码如下:
 # 定义一个管道实例 
 pip = xtredis.pipeline() 
 # 做第一步操作,给BankA自增长1 
 pip.incr('BankA') 
 # 做第二步操作,给BankB自减少1 
 pip.desc('BankB') 
 # 执行事务 pip.execute() 

以上便展示了 python-redis 的一些常用方法,如果想深入了解其他的方法,可以参考 python- redis 的源代码(查看源代码 pycharm 快捷键提示:把鼠标光标放在 import Redis 的 Redis 上, 然后按 ctrl+b 即可进入)

发布了854 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41375318/article/details/104062247
今日推荐