1.什么是redis?
redis是一个基于内存的高性能key-value数据库。可用于缓存,事件发布或订阅,高速队列等场景。
redis全称为remote dictionary server(远程字典服务器)用C语言编写的,是当下热门的NoSql数据库。
redis默认有16个数据库,从0开始。可用 select 数据库号 来选择数据库,默认使用的0号数据库。
redis默认没有密码。
2.redis支持多种数据类型(string,list,hash,set,sorted set)
1)String
String是redis最基本的数据类型,redis中的一个字符串的value最多可以是512M
常用命令:set/get/mset/mget/incr/decr/incrby/decrby等
// 演示 set/get/mset/mget
127.0.0.1:6379> set k v
OK
127.0.0.1:6379> get k
"v"
127.0.0.1:6379> mset k1 v1 k2 v2
OK
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379>
// incr/incrby演示 操作的value必须是数字否则报错。
127.0.0.1:6379> set k3 3
OK
127.0.0.1:6379> incr k3
(integer) 4
127.0.0.1:6379> incrby k3 3
(integer) 7
127.0.0.1:6379> get k3
"7"
127.0.0.1:6379>
2)list
redis 的list实现是一个双向的链表。支持反向查找和遍历;
常用命令:lPush/rPush/lPop/rPop/lRange等。
127.0.0.1:6379> lpush list a b c
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpush list 1 2 3
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "c"
2) "b"
3) "a"
4) "1"
5) "2"
6) "3"
127.0.0.1:6379> rpop list
"3"
127.0.0.1:6379> lpop list
"c"
127.0.0.1:6379>
3)Hash
redis的hash的value实际上是一个HashMap;
常用命令:hSet/hGet/hmSet/hmget/hgetAll/hDel等
127.0.0.1:6379> hset hash age 20
(integer) 1
127.0.0.1:6379> hget hash age
"20"
127.0.0.1:6379> hmset hash1 name tale age 20
OK
127.0.0.1:6379> hmget hash1 name age
1) "tale"
2) "20"
127.0.0.1:6379>
4)set
set内部实现是一个value为null的HashMap。
常用命令:sAdd/sMembers/sPop/sRem/sDiff/sunion等
127.0.0.1:6379> sadd set a b c d
(integer) 4
127.0.0.1:6379> smembers set
1) "a"
2) "d"
3) "b"
4) "c"
127.0.0.1:6379> spop set
"c"
127.0.0.1:6379> srem set a
(integer) 1
127.0.0.1:6379> sadd set1 a b
(integer) 2
127.0.0.1:6379> sdiff set set1
1) "d"
127.0.0.1:6379> sunion set set1
1) "a"
2) "b"
3) "d"
127.0.0.1:6379>
5)sorted set
可以理解为有序的set。
实现方式:使用HashMap和跳跃表(SkipList)来保证数据的存储和有序;
常用命令:zadd/zrem/zscore/zRange等;
127.0.0.1:6379> zadd zset 90 a 80 b 70 c
(integer) 3
127.0.0.1:6379> zrange zset 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "c"
2) "70"
3) "b"
4) "80"
5) "a"
6) "90"
127.0.0.1:6379>
redis支持(部分支持)事务
redis执行事务的过程:
- 开启事务(multi)
- 命令入队
- 执行事务(exec)
redis的单个命令执行都是遵循原子性的。
然而redis的事务却不遵循原子性。比如:
127.0.0.1:6379> set k a
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 1
QUEUED
127.0.0.1:6379> incr k
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> get k
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "1"
4) "a"
127.0.0.1:6379>
以上就可以看出redis的事务不是原子性的。原子性:是要么都执行,要么都不执行。
redis持久化
redis的持久化方式有两种:RDB和aof(默认使用RDB,aof是关闭的:appendonly no)
RDB持久化方式:redis会fork一个子进程和父进程的数据、环境变量等一致,在指定时间间隔内保存数据到临时文件中,待持久化结束,再替换上一次持久化文件。整个过程中,主进程是不进行任何IO操作的。
redsi.conf配置文件中:
save 900 1 #900秒内如果超过1个Key被修改,则启动快照保存 save 300 10 #300秒内如果超过10个Key被修改,则启动快照保存 save 60 10000 #60秒内如果超过10000个重点被修改,则启动快照保存
rdb在指定时间内修改次数超过规定次数就会产生rdb文件(文件名默认为:dump.rdb 建议不要修改文件名)
flushAll也会产生dump.rdb文件,但是里面是空的,无意义;
rdb快照:
- save:只管保存,其他不管,全部阻塞
- bgsave:会在后台进行异步快照操作,快照的同时还可以响应客户端请求。
优点:高效。
缺点:数据一致性较弱,会缺失最后一次持久化的数据。fork的时候内存数据被克隆了一份,消耗内存。
aof持久化方式:采用文件追加的方式。持续追加会导致文件越来越大,因此增加了重写机制,当aof文件超过阈值,会触发重写机制,redis就会启动aof文件的内容压缩,
只保留可以恢复数据的最小指令集,可以使用bgrewrietaof
rewrite(重写)原理:aof文件持续增长过大,超过阈值(64M)是,fork一个新的进程来重写aof文件,没有读取旧aof文件而是将内存的数据库的内存以命令的方式重写了一个aof文件。redis会记录上一次重写是aof文件的大小,默认配置aof文件是上一次aof文件大小的一倍。
redis默认不开启aof持久化。需要在redis.conf文件修改appendonly on 修改为yes
如aof文件被写坏,可用命令:redis-check-aof--fix进行修复
优点:数据一致性较强。
缺点:相同数据集的数据aof文件要大于rdb文件,恢复速度慢于rdb
当rdb和aof同时开启的时候,redis只会找aof文件。
主从复制:主机可以进行读写操作,从机只能读,不能写。
一主二仆:一个主机两个从机
同时启动三个或多个:
redis-server ../redis6379.conf
redis-cli -p 6379
redis-server ../redis6380.conf
redis-cli -p 6380
redis-server ../redis6381.conf
redis-cli -p 6381
6380和6381作为从机执行: slaveof 127.0.0.1 6379(slaveof ip 主机端口)
薪火相传:6379端口为6380主机,6380端口为6381的主机。
反客为主:人为方式;当主机down,命令:slaveof no one
哨兵模式:监听主机,当主机down了,会投票从机当主机。(二者投票数相同会重新投票)
在sentinel.conf文件配置,如果没有则自己创建。
sentinel monitor 主机名字(随意起)127.0.0.1 主机端口 1 // 1表示投票数为1时成为主机
//然后命令启动哨兵模式
./redis-sentinel ../sentinel.conf
//以上操作是在centos环境操作的。
哨兵模式可实现高可用。
redis的应用场景有哪些会话缓存(最常用)
- 消息队列,
- 比如支付
- 活动排行榜或计
- 发布,订阅消息(消息通知)
- 商品列表,评论列表等
redis常用命令:
keys * // 查看当前库的所有key
exists key // 判断是否存在key
ttl key // 查看key的过期时间 返回-2表示已过期或者不存在-1表示永不过期
expire key 秒 // 为key设置过期时间
type key // 判读key的类型
// 事务
multi // 事务开启
exec // 事务执行
watch key [key] // 监视一个或多个key,如果在事务执行之前,这些key被操作,事务将被打断
unwatch // 取消watch命令对所有key的监视
discard // 取消事务
select 1 //选择redis的1号数据库
config get //获得服务配置
confi get dir //获取redis的安装位置
flushdb //删除当前选择的数据库中的key
flushall //删除所有数据库中的键
info
info replication // 查看当前角色,主机,从机
redsi-benchmark --help //redis自带的性能测试工具,此命令不是在redis里面使用
命令大全