Redis基础篇

介绍

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

redis的安装

1. yum install redis -y

2. 源码编译安装
1) 下载redis源代码
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2) 解压缩源代码
tar -xzf redis-4.0.10.tar.gz
3) 进入redis目录,编译安装, 生成可执行命令.
cd redis-4.0.10
4) 安装三部曲, redis不需要执行configure, 因为存在makefile
make && make install

redis的配置

# 安全性能下的启动redis ,在redis.conf中,更改默认端口,添加密码,开启安全模式
1.手动创建redis的配置文件
touch s17redis.conf 或 修改redis.conf文件

2.vim配置文件
bind 0.0.0.0
protected-mode yes
port 6888
daemonize yes
requirepass  123

相关操作

1. 启动redis服务端
redis-server  或 redis-server s17redis.conf  -->指定配置文件

2. 测试访问redis服务端
1) redis-cli  -p 6888          # 默认6379
2) 通过auth指令,进行redis密码验证
auth 123
3) 测试
发送 ping, 收到pong  -->代表redis正常

grep -v "^#" redis.conf |  grep -v "^$"  # 过滤掉注释行和空白行, 提取到有用信息

redis数据类型

# key:value存储系统
字符串 (strings)
散列   (hashes)
列表   (lists)
集合   (sets)
有序集合(sorted sets)

基本命令

set key value # 设置一个键值对
get key       # 获取key的值
keys *        # 查看所有key
type key      # 查看key类型
expire key seconds    # 设置过期时间
ttl key       # 查看key过期剩余时间  (-2表示key已经不存在)
persist       # 取消key的过期时间    (-1表示key存在,没有过期时间)
exists key    # 判断key存在         (存在返回1 <--> 否则0)
del keys      # 删除key, 可以删除多个
dbsize        # 计算key的数量

strings类型

set    # 设置key
get     # 获取key
append  # 追加string
mset    # 设置多个键值对
mget    # 获取多个键值对
del     # 删除key
incr    # 递增+1
decr    # 递减-1

示例

set name 'yu'        # 设置key

get name           # 获取value

append name ' dsb'    # 追加key的string
(integer) 10
mset user1 'alex' user2 'xiaopeiqi'  # 设置多个键值对

mget user1 user2 name  # 获取多个value

del name          # 删除key
(integer) 1
127.0.0.1:6379> get name       # 获取不存在的value,为nil
(nil)
127.0.0.1:6379> set num 10       # string类型实际上不仅仅包括字符串类型,还包括整型,浮点型。redis可对整个字符串或字符串一部分进行操作,而对于整型/浮点型可进行自增、自减操作。
OK    
127.0.0.1:6379> get num
"10"
127.0.0.1:6379> incr num    # 给num string 加一 INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,可以用作计数器
(integer) 11
127.0.0.1:6379> decr num    # 递减1  
(integer) 10

list类型

lpush          # 从列表左边插
rpush          # 从列表右边插
lrange         # 获取一定长度的元素  lrange key  start stop
ltrim          # 截取一定长度列表
lpop           # 删除最左边一个元素
rpop           # 删除最右边一个元素
lpushx/rpushx  # key存在则添加值,不存在不处理

示例

lpush duilie 'alex' 'peiqi' 'ritian'  # 新建一个队列,从左边放入三个元素

llen duilie            # 查看队列长度

lrange duilie 0 -1     # 查看对列所有元素

rpush duilie 'chaoge'  # 从右边插入chaoge

lpushx duilie2  'dsb'  # 队列存在则添加元素,key不存在则不作处理

ltrim duilie 0 2       # 截取队列的值,从索引0取到2,删除其余的元素

lpop #删除左边的第一个
rpop #删除右边的第一个

set集合类型

sadd/srem     # 添加/删除 元素
sismember     # 判断是否为set的一个元素
smembers      # 返回集合所有的成员
sdiff         # 返回一个集合和其他集合的差异
sinter        # 返回几个集合的交集
sunion        # 返回几个集合的并集

redis的集合,是一种无序的集合,集合中的元素没有先后顺序。可以去重.

示例

sadd zoo wupeiqi yuanhao  #添加集合,有三个元素,不加引号就当做字符串处理

smembers zoo          # 查看集合zoo成员

srem zoo  wupeiqi     # 删除zoo里面的alex

sismember zoo wupeiqi # 返回改是否是zoo的成员信息,不存在返回0,存在返回1

sadd zoo wupeiqi      # 再把wupeiqi加入zoo

smembers zoo          # 查看zoo成员

sadd zoo2 wupeiqi mjj # 添加新集合zoo2

sdiff zoo zoo2        # 找出集合zoo中有的,而zoo2中没有的元素,有先后顺序.

sinter zoo zoo1       # 找出zoo和zoo1的交集,都有的元素

sunion  zoo zoo1      # 找出zoo和zoo1的并集,所有的不重复的元素

有序集合

命令以z开头,用来保存需要排序的数据

zrange(正序), zreverange(倒序)

ZREVRANGE mid_test 0 -1 withscores   # 倒序
ZRANGE mid_test 0 -1 withscores      # 正序
1.移除
ZREM mid_test text
ZRANGE mid_test 0 -1 withscores  # 全部移除

2.返回有序集合mid_test的基数
ZCARD mid_test

3.返回成员的score值
ZSCORE mid_test alex

4.zrank返回有序集合中,成员的排名。默认按score,从小到大排序。
ZRANGE mid_test 0 -1 withscores
ZRANK mid_test wusir

哈希数据结构

哈希结构(k1 -> k1 : v1) 如同字典套字典 { k1 : { k2: v2 } },取出v2必须k1,取出k2
哈希是从redis-2.0.0版本之后才有的数据结构。
hset      # 设置散列值
hget      # 获取散列值
hmset     # 设置多对散列值
hmget     # 获取多对散列值
hsetnx    # 如果散列已经存在,则不设置(防止覆盖key)
hkeys     # 返回所有keys
hvals     # 返回所有values
hlen      # 返回散列包含域(field)的数量
hdel      # 删除散列指定的域(field)
hexists   # 判断是否存在

示例

# redis hash是一个string类型的field和value的映射表
语法: hset key field value  

hset news:1  title "news"     # 设置news的id为1,添加数据title的值是"news"

hget news:1 title             # 获取news:1的标题

hmget news:1  title content   # 获取多对news:1的 值

hmset news:2 title "news1" content "Contents1"  # 设置多个field

hmget news:2 title  content   # 获取news:2的多个值

hkeys news:1  		# 获取新闻news:1的所有key

hvals news:1   		# 获取新闻news:1的所有值

hlen news:1    		# 获取新闻news:1的长度

hdel news:1 title   # 删除新闻news:1的title

hlen news:1         # 看下新闻news:1的长度

hexists news:1 title # 判断新闻1中是否有title,不存在返回0,存在返回1

redis发布订阅

发布订阅, 更像一个广播系统, 多个Subscriber可以订阅多个Channel, 多个Publisher可以往多个Channel中发布消息, 可以这么理解:
	Subscriber: 收音机, 可以收到多个频道, 并以队列方式显示.
	Publisher: 电台, 可以往不同的FM频道中发消息.
	Channel: 不同频率的FM频道.
通过发布publish、订阅subscribe实现订阅

命令

PUBLISH channel msg
    将信息 message 发送到指定的频道 channel

SUBSCRIBE channel [channel ...]
    订阅频道,可以同时订阅多个频道

UNSUBSCRIBE [channel ...]
    取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道
PSUBSCRIBE pattern [pattern ...]
    订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符
    
PUNSUBSCRIBE [pattern [pattern ...]]
    退订指定的规则, 如果没有参数则会退订所有规则
PUBSUB subcommand [argument [argument ...]]
    查看订阅与发布系统状态
注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。

步骤

1.启动两个redis-cli窗口,均订阅diantai 频道(channel)
PSUBSCRIBE diantai*

2.启动发布者向频道 diantai发送消息
redis-cli
PUBLISH diantai '你好'

持久化

Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

RDB持久化

RDB持久化产生的RDB文件是一个经过压缩的二进制文件,被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。
1.创建配置文件 rdbredis.conf  

daemonize yes                 # 后台运行redis 
port 6379                     # redis端口 
logfile /data/6379/redis.log  # redis日志文件位置
dir /data/6379/               # 指定redis数据文件夹放在哪 
dbfilename  s17dump.rdb       # 指定rdb的数据文件    
bind 0.0.0.0
requirepass 123               # 指定redis的密码    
save 900 1                    # 代表  900秒内 有1个修改key的操作,就进行持久化       
save 300 10                   # 300秒内 有10个修改类的操作,就持久化
save 60  10000                # 60秒内 有10000个修改类的操作,就持久化

2.递归创建文件夹 
mkdir -p /data/6379/

3.通过配置文件启动redis服务端,支持rdb持久化的服务端
redis-server  rdbredis.conf 

4.登录redis设置一个key
redis-cli -a 123

5.检查目录,/data/6379底下没有dbmp.rdb文件

6.每写入文件,通过save触发持久化,将数据写入RDB文件
save

aof持久化

记录服务器执行的所有变更操作命令(例如set del等),并在服务器启动时,通过重新执行这些命令来还原数据集.不需要手动save来触发持久化.

配置

1.创建aof配置文件 aofredis.conf

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename  dbmp.rdb
requirepass 123
save 900 1
save 300 10
save 60  10000
appendonly yes
appendfsync everysec

2.启动redis服务
redis-server /etc/aofredis.conf

3.检查redis数据目录/data/6379/是否产生了aof文件
appendonly.aof  dbmp.rdb  redis.log

4.登录redis-cli,写入数据,实时检查aof文件信息
tail -f appendonly.aof

5.设置新key,检查aof信息,然后关闭redis,检查数据是否持久化
redis-cli -a 123 shutdown
AOF持久化配置,两条参数

appendonly yes
appendfsync  always    # 总是修改类的操作
             everysec  # 每秒做一次持久化
             no        # 依赖于系统自带的缓存大小机制
redis 持久化方式有哪些?有什么区别?

rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog

redis不重启,rdb切换到aof

要确保redis的版本在2.2以上   # redis-server -v
通过config set命令,达到不重启redis服务,从RDB持久化切换为AOF
1.登陆rdb数据库,通过两条命令,临时修改切换到aof模式下,把rdb数据转化为aof的模式
CONFIG set appendonly yes   # 开启AOF功能
CONFIG SET save ""          # 关闭RDB功能

2.此时还是临时生效,必须修改配置文件,永久生效
配置文件rdb模式的rdbredis.conf 文件
daemonize yes       
port 6379           
logfile /data/6379/redis.log
dir /data/6379/         
bind 0.0.0.0
appendonly yes    
appendfsync everysec   

redis主从同步机制

原理

原理:
1. 从服务器向主服务器发送 SYNC 命令。
2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。
1.配置文件
redis-6379.conf  (主)

port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379

redis-6380.conf  (从)

port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
SLAVEOF 127.0.0.1  6379    # 指定6379为主服务器

2.在data下创建 
mkdir 6379 6380 6381

3.分别启动redis
info replication     # 查看主从状态

4.进行测试

手动进行主从复制故障切换

# 当主服务器挂掉,可以手动修改
1.选取其中一台从服务器当做主服务器(6380)
slaveof on one 

2.另一台服务器作为从服务器 (6381)
slaveof  127.0.0.1  6380

3.此时则完成,info replication查看状态.
posted @ 2019-06-28 08:40  言值  阅读(176)  评论(0编辑  收藏  举报