Redis基础笔记 - 数据类型&部署方式&项目配置
Redis 数据类型
Redis 常用的数据类型:strings(字符串)、Lists(列表)、Hashes(哈希)、Sets(集合)、Sorted sets(有序集合) 等。
官方文档对于数据类型说明 https://redis.io/topics/data-types-intro
Redis Strings
Redis String 字符串类型,最简单的数据类型。
1 2 3 4
| > set mykey somevalue OK > get mykey "somevalue"
|
Redis Lists
Redis Lists 存储的字符串类型的元素,是按插入顺序排序的列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| > rpush mylist A (integer) 1 > rpush mylist B (integer) 2 > lpush mylist first (integer) 3 > lrange mylist 0 -1 1) "first" 2) "A" 3) "B" > lpop mylist "first" > rpop mylist "B" > lrange mylist 0 -1 1) "A"
|
Redis Hashes
Redis Hashes 是字符串类型的键值对。
1 2 3 4 5 6 7 8 9 10 11 12 13
| > hset myhash name liuqi (integer) 0 > hget myhash name "liuqi" > hmset myhash age 27 website liuqitech.com OK > hgetall myhash 1) "name" 2) "liuqi" 3) "age" 4) "27" 5) "website" 6) "liuqitech.com"
|
Redis Sets
Redis Sets 是字符串类型的无序集合,不能有重复的元素。
1 2 3 4 5 6 7 8 9 10
| > sadd myset 1 2 3 (integer) 3 > smembers myset 1) "1" 2) "2" 3) "3" > sismember myset 1 (integer) 1 > sismember myset 10 (integer) 0
|
Redis Sorted sets
Redis Sorted sets 与 Redis Sets 不同的是,每一个元素都会关联一个浮点数类型的分数。
1 2 3 4 5 6 7 8 9 10 11 12
| > zadd hackers 1940 "Alan Kay" (integer) 1 > zadd hackers 1957 "Sophie Wilson" (integer) 1 > zadd hackers 1953 "Richard Stallman" (integer) 1 > zadd hackers 1949 "Anita Borg" > zrange hackers 0 -1 1) "Alan Kay" 2) "Anita Borg" 3) "Richard Stallman" 4) "Sophie Wilson"
|
Redis 部署方式
单机、主从、哨兵、集群
单机
单机方式没什么好说的,使用默认的配置文件启动即可。
1
| ./redis-server redis.conf
|
主从复制 (replication)
配置主从复制方式非常简单,只需要在 slave 的配置文件中添加如下配置:
1
| slaveof 192.168.1.1 6379
|
其中 192.168.1.1 6379 为 master 的IP和端口
官方文档 https://redis.io/topics/replication
哨兵(Sentinel)
哨兵是在主从复制的基础上进行的增强方案。原主从复制的方式中,若master宕机,无法进行主从切,所以会引发一些故障。哨兵可以监控多个,master-slave集群,若发现其中的master宕机时,会把该master下的slave转换为master,同时原master下的slave也会slaveof为新的master。
哨兵启动的方式有以下两种,sentinel的默认端口为26379。
1
| redis-sentinel /path/to/sentinel.conf
|
1
| redis-server /path/to/sentinel.conf --sentinel
|
我们需要配置监听的master,slave无需手动配置。
1 2 3 4 5 6 7 8 9
| sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4 sentinel down-after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5
|
以上为监听两个master的例子。sentinel monitor 语句参数的含义如下:
1
| sentinel monitor <master-group-name> <ip> <port> <quorum>
|
其中quorum的意义为,当sentinel为集群时,若quorum为2,此时其中监听的一个master发生了宕机,当有2个sentinel认为它为不可用状态的时候才会真正判定该master已经为不可用状态。
官方文档 https://redis.io/topics/sentinel
集群 (cluster)
按照文档做个简单的搭建,复制6份redis到文件夹(如 7000 7001 7002 7003 7004 7005),7000到7005的redis.conf分别按以下模板进行配置
1 2 3 4 5
| port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
|
分别启动这6个reids实例,然后redis-cli创建集群(5以上版本)
1
| ./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
|
官方文档 https://redis.io/topics/cluster-tutorial
Spring Boot 配置
我demo中使用的 Spring Boot 版本为 2.1.6.RELEASE
添加依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
|
查看依赖可知现在版本的使用的默认的reids客户端为 Lettuce
通过查看LettuceConnectionConfiguration
可发现,它可以为我们初始化一个 RedisTemplate<Object, Object>
类型的 redisTemplate,和一个 RedisTemplate<String, String>
类型的 stringRedisTemplate。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Configuration @ConditionalOnClass(RedisOperations.class) @EnableConfigurationProperties(RedisProperties.class) @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) public class RedisAutoConfiguration {
@Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); return template; }
@Bean @ConditionalOnMissingBean public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; }
}
|
后面的例子中为了方便测试,直接注入stringRedisTemplate
来使用,当然你也可以自定义自己需要类型的 RedisTemplate。针对不同的部署方式,修改application.yml 配置文件如下:
单机
1 2 3 4
| spring: redis: host: 127.0.0.1 port: 6379
|
哨兵
1 2 3 4 5
| spring: redis: sentinel: master: mymaster nodes: 127.0.0.1:26379, 127.0.0.1:26380
|
集群
1 2 3 4
| spring: redis: cluster: nodes: 127.0.0.1:7000, 127.0.0.1:7001, 127.0.0.1:7002, 127.0.0.1:7003, 127.0.0.1:7004, 127.0.0.1:7005
|