redis总结

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的应用场景有哪些会话缓存(最常用)

  1. 消息队列,
  2. 比如支付
  3. 活动排行榜或计
  4. 发布,订阅消息(消息通知)
  5. 商品列表,评论列表等

 

 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里面使用

 命令大全

 

 

 

 

 http://doc.redisfans.com/

 

posted @ 2019-09-25 16:32  创奇  阅读(876)  评论(0编辑  收藏  举报