末学者笔记--Redis数据库及集群

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实现。

发布和订阅功能:可以用来做聊天软件。

 

三.redismemcached的比较:                                          

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中指定区间内的元素,区间以偏移量startstop指定,如果要左边的第一个到最后的一个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下有fieldfield下有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

获取某个哈希中所有的fieldvalue

  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
会将在multiexec中的操作一并提交。

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

每一台机器创建3redis配置文件

2.部署:

第一台机器配置

mkdir conf

touch 7000.conf 7001.conf 7002.conf

vim 7000.conf     #编辑文件并且把如下内容拷贝进去(剩下的7001.conf7002.conf也是如此,把7000改成70017002即可)

 

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.conf7005.conf也是如此,把7000改成70047005即可)

 

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切换数据库34....,其只有一个数据库;

存入数据时,每个数据会切换端口位置,但不影响获取,若有主节点损坏,从点会自动补上。

——————————————————————————分割线————————————————————————————

原文地址:https://www.cnblogs.com/feige2L/p/10908107.html