第一步:

官网:redis.io

命令文档:http://redisdoc.com

远程:redisdesktop.com

下载redis到 usr/local/

查找jar包: search.maven.org

$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz $ tar xzf redis-5.0.5.tar.gz $ cd redis-5.0.5 $ make

make后会报2个错,需要 yum install gcc -y 安装gcc

make的时候最好加上sudo,有些文件需要root权限

清零上一次make后产生的文件: make distclean

make install: 可以在任意usr/bin下执行redis/usr/下的可执行文件

 

第二步:

启动的几种方式:

1.$ src/redis-server

默认端口:6379

早期版本好像成为前台启动,Ctrl+C后或者退出窗口后就会结束

但是在5.05版本退出之后也在启动,并未终止

 

2 ./redis-server &

后台启动并输出日志到nohup.out

nohup.out /usr/local/redis/src/redis-server

 

关闭: src/redis-cli shutdown

报错:ERR Errors trying to SHUTDOWN. Check logs.

日志文件路径错误,找到redis下redis.conf

sudo vi redis.conf 

找到 logfile ""  , dir ./

修改为: logfile /usr/local/redis/redis_log/redis_log.log

如果/usr/local/redis 下面没有相应的文件夹和文件对应创建且 赋予读写权限

使用指令: sudo chmod 777 redis_log.log

改 redis.conf

logfile "/usr/local/redis-5.0.5/redis_log/redis_log.log"

dir /usr/local/redis-5.0.5/redis_dbfile/

改了配置文件后还未生效,所以得kill -9 端口号 之后 启动redis 再试下shutdown

 

3.3中客户端:

1.命令行客户端:redis-cli

2.redis远程客户端:

命令:

切换库:select 5

删除库内所有数据: flushall

删除本库所有数据: flushdb

获取redis的所有配置项: config get *

退出redis客户端: exit

查看key的数目:DBSIZE

查看redis服务器的统计信息:info

 

列出所有key:keys *

存在key:exists key

将当前库中的key移动到给定的库中:move key db

设置key的过期时间:expire key seconds

查看key过期时间:ttl key

查看数据类型:type key

删除key:del key

 

数据类型5种:

1.字符串String:放在内存里面,速度非常快,甚至可以存图片,将图片base64后就可以存放。

操作:set,get,

incr:将数字加1 如果key不存在,会初始化0后再加1

decr:将数字减1 如果key不存在,会初始化0后再减1

setex:设置key,过期时间,value

setnx:如果存在就不设置

getset:设置key的值 并返回之前的value

STRLEN:获取key的value的长度

append:如果key有值,则加到value,如果没有,则设置为value

incrby:每次增加步长

decrby:每次减少步长

getrange:取一个范围的值

setrange:从第几个下标替换为新的字符串

mset:同时赋值一个或多个key的值

mget:同时获取一个或多个key的值

 

 

 

哈希类型hash:

hset:key: key value设置一个hash值 也可以设置多个啊

hget:根据Key获取值

hmset: key: field:value field:value

hmget:获取1个key的多个key值

hgetall:获取所有key的值或域

hdel:删除key中的指定的1个或多个field

hkeys:查看key的所有的字段

hvals:查看key的所有的值

hlen:获取hash表中Key中的个数

hexists:查看hash表给定field是否存在 存在返回1 不存在返回0

hincrby:给field的value加值

hincrybyfloat:给field的value加浮点值

hsetnx:当field不存在的时候会设置成功

 

 

列表类型list

lpush:插入列表左边

rpush:插入列表右边

lrange:查看范围内的数据

lpop:把列表左边数据剔除

rpop:把列表右边数据剔除

lindex:获取下标为指定位置的元素

llen:获取长度

lrem:删除key中指定长度的与value值相等的数据

ltrim:删除位置以外的数据

lset:将指定位置的value换掉

linsert:在key的value之前或之后插入数据

 

集合类型Set

sadd:将1个或多个member加入到集合key中,即集合中不出现重复数据

smembers:获取集合Key中的所有成员元素

sismeber:判断member是否是集合key的成员

scard:获取集合里面的元素个数

screm:删除集合key的一个或多个member元素

srandmember:随机返回集合一个元素

spop:随机删除集合一个元素

smove:将member元素从一个集合移动到另一个集合

 

有序集合类型zst

zadd:将1个或多个member元素及其score值加入到有序集合key中

zrem:删除有序集合key中的1个或多个成员

zcard:获取有序集合中key的元素的个数

zrank:获取有序集合中成员member的排名,有序集合按score值从小到大排序

zrevrank:获取有序集和key中member的排名,有序集合按score值从大到小排序

zrangebyscore:获取有序集合key中,score介于最小值到最大值之间的成员

zrevrangebyscore:获取有序集合key中,score介于最大值到最小值之间的成员

zcount:获取有序集合中,score介于最大值和最小值之间的个数

zrange:获取key中按score从小到大排序

zrevrange:获取key中按score从大到小排序

 

第四布:

java操作redis

1.新建一个maven项目 加入依赖:

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>3.1.0-m1</version>

</dependency>

2.连接redis

Jedis jedis=new Jedis("192.168.152.133",6379);

System.out.println(jedis.ping());

 

重启后有可能远程连接不能用,可能是默认开启防火墙,

查看防火墙: systemctl status firewalld.service

停止开机启动防火墙: systemctl disable firewalld.service

 

 

redis发布订阅:

发送者发送消息,订阅者接收消息

发布订阅也叫生产消费者模式,是实现消息队列的一种

 

 

命令: SUBSCRIBE channel(这个是发布者和订阅者约定的频道,订阅者接收频道)

PUBLISH channel(发布者发布频道)

 

redis事务:

1.正常情况:

MULTI:用MULTI告诉redis,接下来执行的命令你先不要执行,而是要把他们存起来(开启事务)

SADD “user1” 2第一条命令进入等待队列(命令入队)

SADD “user2” 1第一条命令进入等待队列(命令入队)

EXEC 告知redis执行前面发送的两条命令(提交事务)

2.错误情况:

MULTI

SADD “user1” 2

set k4

EXEC 会直接报错不执行

3.例外情况:

MULTI

SADD "user1" valu

incr user1

EXEC

4.放弃情况:

discard

5.复杂情况:

悲观锁:每次拿数据都认为别人会修改该数据,所以每次拿上数据都会上锁,这样别人拿数据就会block阻塞直到拿到锁。传统的关系型数据库里边就用了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁,让别人无法操作该数据

乐观锁:就是很乐观,拿数据的时候认为别人不会修改数据,所以不会上锁,但是在更新的时候会检查下最初的数据和被修改时数据是否一致,如果不一致,则不会修改,一般使用版本号机制进行判断,如果提交的版本大于当前版本,则予以更新,否则会认为是过期数据,不与更新。

 

版本号机制:数据表会添加一个version字段来实现读取数据,之后更新时对此版本号加1,此时将提交的版本号与数据库表对应的当前版本进行对比,如果提交的数据版本号大于数据库表当前版本,则予以更新,否则不与更新

watch机制:

watch k1

redis持久化:

1.RDB方式:redis database 就是在指定时间内将内存的数据集快照写入磁盘,数据恢复时将快照文件直接再读到内存

是在redis.conf中配置

配置格式:

save 900 1

save 300 10

save 60 10000

dbfilename:设置RDB的文件名,默认名是dump.rdb

dir:指定RDB和AOF文件的目录

2.AOF方式:Append-only File Redis每次接收到一次改变数据的命令时,它将该命令写到一个AOF文件中(只记录写操作,读操作不记录),当Redis重启时,他通过执行AOF文件中所有的命令来恢复数据

是在redis.conf中配置:

配置格式:

appendonly:默认是no,开启yes即开启了aof持久化

appendfilename:指定aof文件名,默认文件名是appendonly.aof

appendfsync:

no 不主动进行同步操作,而是根据系统来做,即每30秒一次,比较快但不是很安全

always:每次执行写入都会执行同步,慢一些但是比较安全

everysec:每秒执行一次同步操作,比较平衡,介于安全和速度之间

auto-aof-rewrite-percentage:当目前aof文件大小超过上一次重写的aof文件大小的百分之多少时会再次进行重写,如果没有重写,则以启动时的aof文件大小为依据

auto-aof-rewite-min-size:允许重写的最小的AOF文件大小

aof是完整保存方案

 

默认先加载aof文件

 

redis集群和高可用哨兵模式:

 

主从复制(master/slave):

一主多从:主主要是写,从主要是读,从不能写,会报错,如果主挂了,需手动将别的从改成主,等之前主启动了再配到新的主下,也就是冷处理。

更改配置文件:

主服务器:

include /usr/local/redis-5.0.5/redis.conf

daemonize yes

port 6380

pidfile /var/run/redis_6380.pid

logfile 6380.log

dbfilename dump6380.rdb

从服务器:

include /usr/local/redis-5.0.9/redis.conf

daemonize yes

port 6382

pidfile /var/run/redis_6382.pid

logfile 6382.log

dbfilename dump6382.rdb

slaveof 127.0.0.1 6380

 

如果master宕机了 主服务器挂了之后,需要把从变为主,命令是:

slaveof no one

再把其他从服务器挂到这台服务器下,命令是:

slaveof 主机ip地址

等宕机的这台主机恢复后,再把这台主机也配到新的主服务器就行。

 

总结: 1个master有多个slave,slave挂掉后读处理变慢 master下线后,无法读权限

故障转移需要手动操作,要实现自动化就得用Sentine哨兵,实现故障自动转移

高可用哨兵模式:

复制3份sentinel.conf,为sentinel26380.conf,sentinel26381.conf,sentinel26382.conf

修改Port:26380,26381,26382

修改sentinel monitor mymaster 127.0.0.1 6380 2

 

执行以下命令:

./redis-sentinel ../sentinel26380.conf

./redis-sentinel ../sentinel26381.conf

./redis-sentinel ../sentinel26382.conf

监控3个redis-server

 

会自动执行故障转移操作,提升slave为master

 

redis安全问题:

设置密码:在redis.conf下 requirepass 123456

客户端连接需 AUTH 123456

绑定ip: 把 bind 127.0.0.1 改成允许访问redis的ip地址

命令禁止: rename-command FLUSHALL 重命名命令

rename-command FLUSHDB ""禁止用FLUSHALL命令

rename-command FLUSHALL ""禁止用FLUSHALL命令

rename-command CONFIG 重命名命令

rename-command CONFIG ""禁止CONFIG命令

修改端口

特点:redis足够简单稳定

支持多种数据类型

内存存储读写性能优秀

提供持久化的支持

支持部分事务支持操作