It is the path you have chosen. Take pride in it. Kotomine Kirei

无极之道

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 发布订阅

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 事务(不具有原子性)

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 Replication

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数量的增加也会是延迟更高。

 

Java 使用 Redis

需要下载或者导入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

 

posted on 2019-03-30 16:59  无极之道  阅读(192)  评论(0编辑  收藏  举报

导航