Redis
程序员文章站
2022-03-10 09:13:30
...
前言
Redis是一个开源的,内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)。
基本命令
String:key-value
Redis中所有的数据都是字符串。Redis是单线程的。Redis不适合保存内容大的数据。
get / set / incr /decr
Hash:key-fields-values
相当于一个key对应一个map,map中还有key-value。使用hash对key进行归类。
hset / hget /
List:有顺序可重复
lpush / lrange / rpush / lpop / rpop /
Set:无序不可重复
sadd / smembers / srem
SortedSet:有序,不可重复
zadd / zrange / zrem / zrevrange(倒序)
Redis持久化
rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。默认的持久化方案。
aof:把所有对redis数据库的操作命令保存到文件中。数据库恢复时把所有命令执行一遍。
配置方式:在redis.conf文件中配置。
rdb:
aof:
说明:两种持久化方案同时开启,使用aof文件来恢复数据库。
Redis集群
架构图
图中少画了两条线,你知道是哪两条吗?
投票容错
说明
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度。
- 节点的fail是通过集群中超过半数的节点检查失效时才生效。
- 客户端与redis节点直连,不需要中间proxy层。客户端连接集群中任意一个可用节点即可。
- redis集群把所有的物理节点映射到[0-16383]slot上,cluster负责维护。
Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。
Jedis
连接单机版:@Test
public void testJedis() throws Exception {
// 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
Jedis jedis = new Jedis("192.168.25.153", 6379);
// 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
String result = jedis.get("hello");
// 第三步:打印结果。
System.out.println(result);
// 第四步:关闭Jedis
jedis.close();
}
连接单机版并使用连接池:
@Test
public void testJedisPool() throws Exception {
// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
// 第二步:从JedisPool中获得Jedis对象。
Jedis jedis = jedisPool.getResource();
// 第三步:使用Jedis操作redis服务器。
jedis.set("jedis", "test");
String result = jedis.get("jedis");
System.out.println(result);
// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
jedis.close();
// 第五步:关闭JedisPool对象。
jedisPool.close();
}
连接集群版:
@Test
public void testJedisCluster() throws Exception {
// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.153", 7001));
nodes.add(new HostAndPort("192.168.25.153", 7002));
nodes.add(new HostAndPort("192.168.25.153", 7003));
nodes.add(new HostAndPort("192.168.25.153", 7004));
nodes.add(new HostAndPort("192.168.25.153", 7005));
nodes.add(new HostAndPort("192.168.25.153", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
jedisCluster.set("hello", "100");
String result = jedisCluster.get("hello");
// 第三步:打印结果
System.out.println(result);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster.close();
}
缓存
- 查询数据库之前先查询缓存。
- 查询到结果,直接响应结果。
- 查询不到,查询数据库。
- 把查询结果添加到缓存中。
- 返回结果。
缓存同步:对内容信息做增删改查操作后需要把对应缓存删除。
注意:缓存不能影响正常业务逻辑。
管理工具
Redis可视化管理工具:RedisDeskManager。
应用场景
缓存、消息队列、排行榜、计数器等。
参考资料:https://www.yuque.com/jujianfei/java/pzu8kk