Redis学习笔记
Redis简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
1、支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2、不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3、支持数据的备份,即master-slave模式的数据备份。
Redis优势
1、性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2、丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3、原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4、丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
启动服务:redis-server.exe redis.windows.conf
连接服务:redis-cli.exe -h 127.0.0.1 -p 6379 --raw 后面添加--raw,在输出中文时可避免出现乱码
Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String类型是Redis最基本的数据类型,一个键最大能存储512MB。
1 redis 127.0.0.1:6379> SET name "runoob" 2 OK 3 redis 127.0.0.1:6379> GET name 4 runoob
Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
1 redis> HMSET myhash field1 "Hello" field2 "World" 2 OK 3 redis> HGET myhash field1 4 Hello 5 redis> HGET myhash field2 6 World
List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
1 redis 127.0.0.1:6379> lpush runoob "redis" 2 (integer) 1 3 redis 127.0.0.1:6379> lpush runoob "mongodb" 4 (integer) 2 5 redis 127.0.0.1:6379> lpush runoob "rabitmq" 6 (integer) 3 7 redis 127.0.0.1:6379> lrange runoob 0 10 8 1) "mysql" 9 2) "mongodb" 10 3) "redis"
Set是string类型的无序集合。
1 redis 127.0.0.1:6379> sadd runoob "redis" 2 (integer) 1 3 redis 127.0.0.1:6379> sadd runoob "mongodb" 4 (integer) 1 5 redis 127.0.0.1:6379> sadd runoob "rabitmq" 6 (integer) 1 7 redis 127.0.0.1:6379> sadd runoob "rabitmq" 8 (integer) 0 9 redis 127.0.0.1:6379> smembers runoob 10 1) "mysql" 11 2) "mongodb" 12 3) "redis"
ZSet和Set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
1 redis 127.0.0.1:6379> zadd runoob 0 redis 2 (integer) 1 3 redis 127.0.0.1:6379> zadd runoob 0 mongodb 4 (integer) 1 5 redis 127.0.0.1:6379> zadd runoob 0 rabitmq 6 (integer) 1 7 redis 127.0.0.1:6379> zadd runoob 0 rabitmq 8 (integer) 0 9 redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000 WITHSCORES 10 1) "mongodb" 11 2) "0" 12 3) "rabitmq" 13 4) "0" 14 5) "redis" 15 6) "0"
Redis HyperLogLog
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
1 127.0.0.1:6379> pfadd runoobkey redis 2 (integer) 1 3 127.0.0.1:6379> pfadd runoobkey mongodb 4 (integer) 1 5 127.0.0.1:6379> pfadd runoobkey mysql 6 (integer) 1 7 127.0.0.1:6379> pfcount runoobkey 8 (integer) 3
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
1 127.0.0.1:6379> publish redisChat "hand in ShangHai" 2 (integer) 1
1 127.0.0.1:6379> subscribe redisChat 2 Reading messages... (press Ctrl-C to quit) 3 1) "subscribe" 4 2) "redisChat" 5 3) (integer) 1 6 1) "message" 7 2) "redisChat" 8 3) "hand in ShangHai"
Redis 事务可以一次执行多个命令:开始事务-命令入队-执行事务
批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
1 127.0.0.1:6379> multi 2 OK 3 127.0.0.1:6379> set bookname C++ 4 QUEUED 5 127.0.0.1:6379> get bookname 6 QUEUED 7 127.0.0.1:6379> sadd booklist "Java" "Oracle" "MySQL" 8 QUEUED 9 127.0.0.1:6379> smembers booklist 10 QUEUED 11 127.0.0.1:6379> exec 12 1) OK 13 2) "C++" 14 3) (integer) 3 15 4) 1) "Oracle" 16 2) "Java" 17 3) "MySQL"
redis主从复制:主机数据更新后根据配置和策略,自动同步到备机的master/slave机制;master以写为主,slave以读为主。
目的:实现读写分离和容灾恢复
配置:配从不配主,只需要配置从库即可,未配置的默认为主库;
slaveof 主库ip 主库端口
配置完成后可以通过info replication查看主从信息
修改配置文件细节:拷贝多个redis.conf文件
开启daemonize yes
pidfile
port
logfile
dbfilename
常用配置模式
1、一主二从:一个master两个slave,master负责写入,slave负责读取;在非哨兵模式下,master宕机之后,redis只能读不能写,此时slave会等待master重新连接或者手动配置产生一个新的master。
2、薪火相传:为mater-slave-slave模式,一个slave可以作为下一个slave的master,这样能有效缓解master的写入压力。
3、反客为主:是在非哨兵模式下采用的配置,当master挂掉之后,且slave不能自动切换到一个新的master下,则选定一台slave,执行slaveof no one,可将该slave置为master。
复制原理
slave启动成功连接到master后会发送一个sync命令,master接到命令后启动存盘进程,将数据同步给slave。
全量复制:master将整个数据同步给slave。
增量复制:master继续将新的数据同步给slave。
当slave首次连接或者重新连接,一次完全同步(全量复制)将会被执行。
哨兵模式(sentinel)
能够监控主机是否故障,如果发生故障会根据投票数自动将从库转换成主库。一组sentinel能同时监控多个master
新建sentinel.conf文件并配置哨兵:sentinel monitor 被监控主机名(自定义) 主机ip 端口 1
数字1表示主机挂掉后slave投票选出新的master
当原master重新连接后会自动变为slave
复制延迟
由于所有的写操作都是先在master上操作,然后同步更新到slave上,所以从master同步到slave有一定的延迟,当系统繁忙的时候延 迟会更加严重,slave数量的增加也会是延迟更高。
需要下载或者导入redis的驱动包:jedis.jar
1 public class RedisTest { 2 public static void main(String[] args) { 3 //连接redis 4 final Jedis jedis = new Jedis("127.0.0.1"); 5 System.out.println("连接结果:" + jedis.ping()); 6 //String实例 7 jedis.set("name","redis"); 8 System.out.println("String实例name存储值为:" + jedis.get("name")); 9 //List实例 10 jedis.lpush("runoob","redis"); 11 jedis.lpush("runoob","mongodb"); 12 jedis.lpush("runoob","rabitmq"); 13 final List<String> list = jedis.lrange("runoob",0,2); 14 for (final String str : list){ 15 System.out.println("List实例存储元素:" + str); 16 } 17 //获取所有Keys 18 final Set<String> keys = jedis.keys("*"); 19 for (final String str : keys){ 20 System.out.println("redis已存在的key:" + str); 21 } 22 } 23 } 24 25 运行结果如下: 26 连接结果:PONG 27 String实例name存储值为:redis 28 List实例存储元素:rabitmq 29 List实例存储元素:mongodb 30 List实例存储元素:redis 31 redis已存在的key:name 32 redis已存在的key:runoob