Redis在项目中的应用

2021SC@SDUSC

在本项目中使用Redis 解决应用服务器的cpu和内存压力,减少io的读操作,减轻io的压力。

Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。

对于那些结构化、多范式规则的数据库系统而言,它更具性能优势。作为缓存,它可以支持大数据存入内存中,只要命中率高,它就能快速响应,因为在内存中的数据读/写比数据库读/写磁盘的速度快几十到上百倍。Redis 响应非常快,每秒可以执行大约 110 000 个写入操作,或者 81 000 个读操作,其速度远超数据库。它们是字符串、哈希结构、列表、集合、可排序集合和基数。比如对于字符串可以存入一些 Java 基础数据类型,哈希可以存储对象,列表可以存储 List 对象等。这使得在应用中很容易根据自己的需要选择存储的数据类型,方便开发。所有 Redis 的操作都是原子的,从而确保当两个客户同时访问 Redis 服务器时,得到的是更新后的值(最新值)。在需要高并发的场合可以考虑使用 Redis 的事务,处理一些需要锁的业务。Redis 可以在如缓存、消息传递队列中使用(Redis 支持“发布+订阅”的消息模式),在应用程序如 Web 应用程序会话、网站页面点击数等任何短暂的数据中使用。
 

RedisTemplate配置

public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
		// 设置序列化
		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
		ObjectMapper om = new ObjectMapper();
		om.setVisibility(PropertyAccessor.ALL, Visibility.ANY);
		om.enableDefaultTyping(DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		// 配置redisTemplate
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
		redisTemplate.setConnectionFactory(lettuceConnectionFactory);
		RedisSerializer<?> stringSerializer = new StringRedisSerializer();
		redisTemplate.setKeySerializer(stringSerializer);// key序列化
		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// value序列化
		redisTemplate.setHashKeySerializer(stringSerializer);// Hash key序列化
		redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);// Hash value序列化
		redisTemplate.afterPropertiesSet();
		return redisTemplate;
	}

缓存配置管理器,配置序列化(缓存默认有效期 6小时),以锁写入的方式创建RedisCacheWriter对象,创建默认缓存配置对象。默认配置,设置缓存有效期 1小时,自定义配置test:demo 的超时时间为 5分钟

public CacheManager cacheManager(LettuceConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofHours(6));
        RedisCacheConfiguration redisCacheConfiguration = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                												.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
		
		RedisCacheManager cacheManager = RedisCacheManager.builder(RedisCacheWriter.lockingRedisCacheWriter(factory)).cacheDefaults(redisCacheConfiguration)
				.withInitialCacheConfigurations(singletonMap(CacheConstant.TEST_DEMO_CACHE, RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5)).disableCachingNullValues()))
				.transactionAware().build();
		return cacheManager;
	}

}

部分Redis操作实例

在JeecgDemoController中用到了Redis操作中的set、get、setObj操作对非关系型数据库中的内容进行编辑等操作。

  @GetMapping(value = "/redisSet")
    public void redisSet() {
        redisUtil.set("name", "张三" + DateUtils.now());
    }


    @GetMapping(value = "/redisGet")
    public String redisGet() {
        return (String) redisUtil.get("name");
    }

    @GetMapping(value = "/redisSetObj")
    public void redisSetObj() {
        JeecgDemo p = new JeecgDemo();
        p.setAge(10);
        p.setBirthday(new Date());
        p.setContent("hello");
        p.setName("张三");
        p.setSex("男");
        redisUtil.set("user-zdh", p);
    }

1. 缓存 Redis最常见的使用场景是缓存。在Web应用程序缓存可以减少数据库的负载,提高应用程序的性能。例如,当用户请求一个页面时,可以首先检查Redis缓存是否有请求的数据。如果有,那么可以直接从缓存提取数据,而不必访问数据库。这可以减少数据库的负载,提高Web应用程序的性能。 2. 分布式锁 Redis还可以用作分布式锁。在分布式系统,需要确保多个进程或线程不会同时访问关键资源。Redis可以使用SETNX命令来实现简单的分布式锁。SETNX命令可以将一个键设置为仅在键不存在时才能设置成功。这意味着只有一个进程或线程可以获得锁。当不再需要锁时,可以使用DEL命令删除键。 3. 计数器 Redis还可以用作计数器。在Web应用程序,计数器可以用来跟踪页面的访问次数、用户的点击次数等信息。Redis提供了INCR和DECR命令来增加和减少计数器的值。这些命令是原子的,因此可以安全地在多个进程或线程之间使用。 4. 发布/订阅 Redis还提供了发布/订阅功能。发布/订阅是一种消息传递模式,其发布者将消息发送到一个特定的频道,订阅者则接收该频道上的所有消息。Redis提供了PUBLISH命令来发布消息,以及SUBSCRIBE和UNSUBSCRIBE命令来订阅和取消订阅频道。 5. 地理位置 Redis还可以用于处理地理位置信息。Redis提供了GEOADD、GEORADIUS、GEORADIUSBYMEMBER等命令来处理地理位置数据。这些命令可以用来存储和查询地理位置信息,并找到附近的位置。这在各种应用程序都很有用,例如餐厅查找、旅游应用程序等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值