Redis数据库
一.概述
redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文档:http://redisdoc.com/index.html
二.redis使用场景:
登录会话存储:存储在redis中,与memcached相比,数据不会丢失。
排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。
作为消息队列:比如celery就是使用redis作为中间人。
当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。
一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
好友关系:微博的好友关系使用redis实现。
发布和订阅功能:可以用来做聊天软件。
三.redis和memcached的比较:
memcached |
redis |
|
类型 |
纯内存数据库 |
内存磁盘同步数据库 |
数据类型 |
在定义value时就要固定数据类型 |
不需要 |
虚拟内存 |
不支持 |
支持 |
过期策略 |
支持 |
支持 |
存储数据安全 |
不支持 |
可以将数据同步到dump.rdb中 |
灾难恢复 |
不支持 |
可以将磁盘中的数据恢复到内存中 |
分布式 |
支持 |
主从同步 |
订阅与发布(实现异步) |
不支持 |
支持 |
四.redis日常操作
1.安装:
使用centos7系统
正常yum install 版本不是最新的。
最新版本如下:
——#wget http://download.redis.io/releases/redis-5.0.0.tar.gz
——#tar -zxvf redis-5.0.0.tar.gz
需要下载编译安装的组件:
——#yum install gcc
——#yum install gcc-c++
安装:
——#cd redis-5.0.0
——#make
——#cp src/redis-server /usr/bin/
——#cp src/redis-cli /usr/bin/
2.启动redis数据库服务
(1)如果是yum安装直接:
service redis start
编译需:
在redis-5.0.0下:
——#vim redis.conf
.........................
bind 192.168.255.27 #需改为本机ip地址
........................
databases 16 #默认数据库个数为16,可改动,最大255个
.......................
daemonize yes #守护进程,默认为no,需开启“yes”;如果不开启,会在前台一直运行,直接卡顿
——#redis-server redis.conf
3.停止redis数据库服务
service redis stop
编译:ps -ef | grep redis
kill -9 pid
4.连接上redis-server:
redis-cli -p 6379 -h 192.168.255.27
5.添加键与键值:
set key value
如:
set username balabala
将字符串值value关联到key。如果key已经持有其他值,set命令就覆写旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。
6.删除:
del key
如:del username
7.设置过期时间
expire key timeout(单位为秒)
也可以在设置值的时候,一同指定过期时间:
——>set key value EX timeout
或:
setex key timeout value
如:——>set username feifei ex 50
8.查看过期时间
ttl key
如:
ttl username
9.查看当前redis所有的key
keys *
10.列表操作
(1)在列表左边添加元素:
——>lpush key value
将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。
(2)在列表右边添加元素:
——>rpush key value
将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操作。当key存在但不是列表类型时,返回一个错误。
(3)查看列表中的元素:
——>lrange key start stop
返回列表key中指定区间内的元素,区间以偏移量start和stop指定,如果要左边的第一个到最后的一个lrange key 0 -1。
(0:指第一个键值;-1:指倒数第一个键值)
(4)移除列表中的元素:
·移除并返回列表key的头元素:
lpop key
·移除并返回列表的尾元素:
rpop key
(5)指定返回第几个元素:
——>lindex key index
将返回key这个列表中,索引为index的这个元素。
如:lindex key 2 #取第三个元素
(6)获取列表中的元素个数:
——>llen key
如:
——>llen languages
(7)删除指定的元素:
——>lrem key count value
如:
——>lrem languages 3 php #从上到下删除3个为“php”的元素
根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:
count > 0:从表头开始向表尾搜索,移除与value相等的元素,数量为count。
count < 0:从表尾开始向表头搜索,移除与 value相等的元素,数量为count的绝对值。
count = 0:移除表中所有与value 相等的值。
11.set集合的操作:
添加元素:
——>sadd set value1 value2....
如:
——>sadd team xiaotuo datuo
——>sadd feige go python c++ java
查看元素:
smembers 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
12.hash,哈希操作:
添加一个新值:
——>hset key field value
即key下有field,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
13. 事务操作:
Redis事务可以一次执行多个命令,事务具有以下特征:
隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。
原子操作:事务中的命令要么全部被执行,要么全部都不执行。
(1)开启一个事务:
multi
以后执行的所有命令,都在这个事务中执行的。
(2)执行事务:
exec
会将在multi和exec中的操作一并提交。
(3)取消事务:
discard
会将multi后的所有命令取消。
(4)监视一个或者多个key:
watch key...
监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。
(5)取消所有key的监视:
Unwatch
14.发布/订阅操作:
给某个频道发布消息:
publish channel message #channel:频道,途径
订阅某个频道的消息:
subscribe channel #subscribe:订购,参加
五.持久化
redis提供了两种数据备份方式,一种是RDB,另外一种是AOF,以下将详细介绍这两种备份策略:
1.RDB
(1)关闭RDB备份:
在解压文件下,redis-5.0.0:
——#vim redis.conf
约在219行,有3个“save”,注释即可
save 900 1 #900秒内发生一次数据更改就备份一次
save 300 10 #300秒内发生10次数据更改就备份一次
save 60 10000 #60秒内发生10000次数据更改就备份一次
(2)默认备份文件dump.rdb
内部存放的是具体的值,数据文件进过压缩,恢复快。
2. AOF
(1)开启
同样在:——#vim redis.conf
约在699行:
appendonly no #将no改成yes,开启
(2)备份机制
——#vim redis.conf
..................
# appendfsync always #每增删改一次就备份一次
appendfsync everysec #每一秒备份一次
# appendfsync no #跟随操作系统备份(一般半小时一次)
..................
再重启一下redis,会生成文件appendonly.aof,其内备份的是操作的命令。
六.redis搭建主从
1.拷贝
拷贝一份redis配置文件为slave-6380.conf
cp redis.conf slave-6380.conf
2.编辑文件
编辑slave-6380.conf文件
——#vim slave-6380.conf
.........................
bind 192.168.254.41
slaveof 192.168.254.41 6379 #手动添加行
.........................
port 6380
.........................
七.redis集群
1.集群架构:
redis集群,这里部在2个机器上
第一台:192.168.254.41
第二台:192.168.254.45
每一台机器创建3个redis配置文件
2.部署:
【第一台机器配置】:
mkdir conf
touch 7000.conf 7001.conf 7002.conf
vim 7000.conf #编辑文件并且把如下内容拷贝进去(剩下的7001.conf和7002.conf也是如此,把7000改成7001和7002即可)
port 7000 #绑定端口
bind 192.168.254.41 #绑定对外连接提供的ip
daemonize yes #开启守护进程
pidfile 7000.pid #进程文件名
cluster-enabled yes #是否是集群
cluster-config-file 7000_node.conf #集群配置文件
cluster-node-timeout 15000 #集群连接超时时间
appendonly yes #数据持久化类型
【第二台机器配置】:
mkdir conf
touch 7003.conf 7004.conf 7005.conf
vim 7000.conf #编辑文件并且把如下内容拷贝进去(剩下的7004.conf和7005.conf也是如此,把7000改成7004和7005即可)
port 7000 #绑定端口
bind 192.168.254.45 #绑定对外连接提供的ip
daemonize yes #开启守护进程
pidfile 7000.pid #进程文件名
cluster-enabled yes #是否是集群
cluster-config-file 7000_node.conf #集群配置文件
cluster-node-timeout 15000 #集群连接超时时间
appendonly yes #数据持久化类型
在两台机器上分别执行这3个配置文件
#192.168.254.41
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
#192.168.254.45
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
【简易法】:编辑脚本
——#vim stat.sh
#!/bin/bash
for i in {0..5}
do
redis-server 700$i.conf
done
3.集群相连:
——#redis-cli --cluster create 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008 --cluster-replicas 1 #“1”表示一个从节点,可修改
会出现:Can I set the above configuration? (type 'yes' to accept): 填“yes”
最终:
登录集群:
不可只以端口节点登录:redis-cli -h 192.168.255.27 -p 7001
这样进去无法创建,更改。
需:redis-cli -c -h 192.168.255.27 -p 7001
——>。。。
【注】
集群数据库不支持select切换数据库3、4....,其只有一个数据库;
存入数据时,每个数据会切换端口位置,但不影响获取,若有主节点损坏,从点会自动补上。
——————————————————————————分割线————————————————————————————