一、什么是redis
- 1.Redis是远程的
有客户端和服务端,客户端和服务端可以布置在不同的机器上,两者经过redis自定义的协议远程传输和交互的,我们一般说的是服务端。默认服务端口为6379。 - 2.Redis是基于内存的
所有的操作非常高速,性能优于比基于硬盘的MySQL要快很多,又因为所有的数据和结构存储于内存中非常吃内存。 - 3.Redis是非关系型数据库
本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要
二、redis应用场景
- 1.缓存
某些系统接口比较慢的时候,可以把一些数据放在Redis中缓存起来,下次取数据就不进行非常耗时的SQL操作了,直接从缓存中取数据,提升系统性能最常用的方法之一; - 2.队列
Redis 中有list接口,可以存储list。 使用Push插入队列的元素, 使用 Pop来弹出退出队列的元素,push和pop操作保证了原子性的实现; - 3.数据存储
所有的增删改查都是在Redis中进行,Redis有硬盘的持久化机制,定期进行存储,不需要借助MySQL进行数据存储,保证了数据的完整性和安全性。
三、Redis安装环境
(一)Linux下安装Redis
- 1、服务器环境
- 2、Redis版本下载:http://download.redis.io/releases/
- 3、预装软件(gcc:c语言编译器,tcl:一种语言)
- 4、服务端安装步骤
1)、进入解压后的目录,执行make
2)、studo make install 将生成的二进制文件放到 /uer/local/bin目录下
3)、复制redis.conf到自己指定的文件夹。 配置redis.conf文件,
修改daemonize yes 后台启动Redis port 7200(多实例和安全问题)
4)、启动 redis-server redis.conf - 5、redis客户端的安装
查看redis客户端 which redis-cli
登录:redis-cli -h 127.0.0.1 -p 7000(-h表示IP地址;-p表示端口号)
redis-cli(默认登录本机6379端口)
登录之后info命令查看redis信息
(二)windows先安装Redis - 1、现在Redis安装包并解压
- 2、打开Windows的cmd窗口,启动服务器(输入:redis-server.exe redis.windows.conf )
- 3、重启一个cmd窗口,启动客户端(输入:redis-cli.exe -h 127.0.0.1 -p 6379 )
- 4、将 redis 服务器启动放入 windows 服务中,使其开机自动启动(输入:redis-server --service-install redis.windows.conf --loglevel verbose)
四、Redis的五种数据类型
- 1、string
// setnx 表示如果没有存在key值则创建该条数据,否则不创建
// setex 设置键值的过期时间
127.0.0.1:6379> set string zhangsna
OK
127.0.0.1:6379> get string
"zhangsna"
127.0.0.1:6379> setex string 10 zhangsna
OK
127.0.0.1:6379> get string
"zhangsna"
// 10秒后
127.0.0.1:6379> get string
"nil"
// 修改内容,将string从第二个制服开始改为yyy
127.0.0.1:6379> setrange string 2 yyy
// 批量操作mset、mget
string自增操作incr(incrby num:增加num)
127.0.0.1:6379> set string2 4
OK
127.0.0.1:6379> get string2
"4"
127.0.0.1:6379> incr string2
(integer) 5
127.0.0.1:6379> get string2
"5"
减操作decrby
127.0.0.1:6379> decrby string2 2
(integer) 3
127.0.0.1:6379> get string2
"3"
- 2.List
从左侧推入两个元素,并从右侧弹出
127.0.0.1:6379> lpush list1 12
(integer) 1
(1.00s)
127.0.0.1:6379> lpush list1 13
(integer) 2
127.0.0.1:6379> rpop list1
"12"
// 获取所有元素
127.0.0.1:6379> lrange list1 0 -1
1) "13"
2) "12"127.0.0.1:6379> lrange list1 0 -1
1) "13"
2) "12"
llen输出List中有几个元素,元素可以重复
127.0.0.1:6379> lpush list 12
(integer) 1
127.0.0.1:6379> lpush list 13
(integer) 2
127.0.0.1:6379> lpush list 13
(integer) 3
127.0.0.1:6379> llen list
(integer) 3
- 3、set(不可重复)
添加元素:sadd set1 12
判断有多少个元素:scard set1
判断某个元素是否在set里面:smembers set1 12
删除某个元素:srem set1 12
127.0.0.1:6379> sadd set1 12
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 1
127.0.0.1:6379> sadd set1 13
(integer) 0
127.0.0.1:6379> scard set1
(integer) 2
- 4、Hash
插入/修改:hset hash1 key1 12
获取:hget hash1 key1
查看hash长度:hlen key
一次性获取:hmget hash1 key1 key2
127.0.0.1:6379> hset hash1 key1 12
(integer) 1
127.0.0.1:6379> hget hash1 key1
"12"
127.0.0.1:6379> hset hash1 key2 13
(integer) 1
127.0.0.1:6379> hset hash1 key3 13
(integer) 1
127.0.0.1:6379> hlen hash1
(integer) 3
127.0.0.1:6379> hset hash1 key3 14
(integer) 0
127.0.0.1:6379> hget hash1 key3
"14"
127.0.0.1:6379> hmget hash1 key1 key2 key3
1) "12"
2) "13"
3) "14"
- 5、sort set
增加/修改:zadd zset1 10.1 val1
查看个数:zcard zset1
查看排名:zrange zset1 0 2 withscores
查看某个value排名:zrank zset1 val2
sort set类型操作,如果两个元素的score一样,按照字节顺序排列先后
127.0.0.1:6379> zadd zset 10.1 val1
(integer) 1
127.0.0.1:6379> zadd zset 11.2 val2
(integer) 1
127.0.0.1:6379> zadd zset 9.2 val3
(integer) 1
127.0.0.1:6379> zcard zset
(integer) 3
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val3"
2) "9.1999999999999993"
3) "val1"
4) "10.1"
5) "val2"
6) "11.199999999999999"
127.0.0.1:6379> zrank zset val2
(integer) 2
127.0.0.1:6379> zadd zset 12.2 val3
(integer) 0
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "11.199999999999999"
5) "val3"
6) "12.199999999999999"
127.0.0.1:6379> zadd zset 12.2 val2
(integer) 0
127.0.0.1:6379> zrange zset 0 2 withscores
1) "val1"
2) "10.1"
3) "val2"
4) "12.199999999999999"
5) "val3"
6) "12.199999999999999"
五、redis的持久化方式
-
1、快照(rdb):redis默认的持久化方式,将内存中的数据写入到硬盘的二进制文件中,可以再配置文件中配置自动快照,如:如果redis在900秒内有超过1个key值发生改变,就会自动快照;由于快照是每隔一段时间执行一次,因此如果redis意外down掉的话,就会丢失部分数据;
- 2、aof方式:redis将每次收到的写命令通过write函数存到硬盘的文件中,重启redis后,会读取这个文件中的写命令并执行,便可以重建整个数据库;首先开启aof,改为appendony yes,开启后会有三种策略可供选择,分别为每次写入redis时都进行持久化、每秒进行持久化和不主动之久话
# appendfsync always
appendfsync everysec
# appendfsync no
应用场景
- 1、获取最新的N条数据;
- 2、排行榜,取TOP N操作;
- 3、精确过期时间;
- 4、计数器;
- 5、某时间段的数据排重;
- 6、队列系统;
- 7、缓存;
常用命令
keys * // 取出所有key
exists name // 是否存在key为name
del // 删除键
expire // 设置某一键的过期时间
ttl // 查询键有效时长
move //将key转移另一个数据库
persist // 移除key的过期时间
randomkey // 随机返回一个key
dbsize // 返回当前数据库键数
info // 获取服务器信息
config get // 返回相关配置的值
flushdb // 删除当前数据库所有key
flushall // 删除所有数据库key
六、主从复制(陪从不配主)
一主两从
-
1、新建两个 redis 的配置文件,分别命名为 redis6380.conf 和 redis6381.conf 作为从库;
2、修改配置文件,端口号和日志名字
-
2、启动主库和从库(从库启动后还未配置为从库时,仍然显示为主库)
- 3、配置从库
slaveof IP地址 端口号
-
4、查看配置情况
注意:
1、redis 的配置完主从复制后,主库用于写入操作,从库用于读取,此时从库无法成功写入数据;
2、如果此时主库停止服务,则此时从库处于待命,主库服务恢复后,从库自动连接;
哨兵模式
由于普通的主从,在主机挂倒之后,从库无法写入,redis 功能无法使用。因此想要寻找一种方法来解决该问题。哨兵模式就是后台监控主库,当主库故障无法工作时,在从库中通过投票的方式选出一个充当主库来继续工作;
-
1、在原来放置 redis 配置文件的文件夹中新建文件 sentinel.conf
- 2、编辑配置文件
sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1
1 代表从库得票数大于 1 时被选择做主库
-
3、启动监控
-
4、停掉主库,从从库中选一个充当主库
6381 被选为主库,6380成为其从库
-
5、重启 6349 库后,该库成为了 6381 的从库(重启后等一段时间,可能无法重启后立即生效);
七、内存淘汰机制
名称 | 描述 |
---|---|
volatile-lru | 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 |
volatile-lfu | 从已设置过期时间的数据集中挑选最不经常使用的数据淘汰 |
volatile-ttl | 从已设置过期时间的数据集中挑选将要过期的数据淘汰 |
volatile-random | 从已设置过期时间的数据集中挑选任意数据淘汰 |
allkeys-lru | 当内存不足写入新数据时淘汰最近最少使用的Key |
allkeys-random | 当内存不足写入新数据时随机选择key淘汰 |
allkeys-lfu | 当内存不足写入新数据时移除最不经常使用的Key |
no-eviction(默认) | 当内存不足写入新数据时,写入操作会报错,同时不删除数据 |
注意:
- 1、redis事务里面的某一个命令执行失败后是无法回滚的;
- 2、默认情况下,如果redis最后一次后太保存数据失败,redis就会停止接受写操作,以这种强硬的方式通知用户redis无法正确持久化到硬盘;