欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis

程序员文章站 2022-03-10 09:13:30
...

前言

  Redis是一个开源的,内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如 字符串(String)、散列(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)。

Redis

基本命令

  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:

Redis

  aof:
Redis

  说明:两种持久化方案同时开启,使用aof文件来恢复数据库。

Redis集群

架构图

Redis

  图中少画了两条线,你知道是哪两条吗?

投票容错

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