社区项目-redis

本文详细介绍了Redis在实际项目中的使用,包括RedisTemplate和StringRedisTemplate的配置与区别,点赞统计、关注取消统计利用Set和ZSet,登录模块优化,以及高并发下缓存失效和数据一致性问题的解决方案。还探讨了SpringCache的使用,Redis的HyperLogLog和Bitmap高级特性,以及Redis的key过期机制。
摘要由CSDN通过智能技术生成

 

目录

 

一、redis

二、使用步骤

Ⅰ.RedisTemplate

1.引入库

2.配置RedisConfig

Ⅱ StringRedisTemplate

三、项目:

Ⅰ 点赞统计Set

redis key的生成工具类

 点赞和收到的总赞逻辑(两次不同的redis操作,开启事务)

 Ⅱ关注,取消统计:ZSet(有序集合)

 Ⅲ优化登录模块

  验证码

 

四、高并发下的缓存失效问题

缓存穿透​

 缓存雪崩​

缓存击穿:使用分布式锁

 

五、缓存数据一致性问题

 

 

六.SpringCache:对缓存的抽象,简化方法

 1.使用步骤

七、Redis高级用法

   ⅠHyperLogLog

HyperLogLog:eg一个人访问几次网站​

UV统计:根据Ip统计​

  Ⅱ. Bitmap

 Bitmap:按位存储只能存储0和1 eg:统计用户的签到​​

DAU:更关注用户的可靠性,根据用户Id​​

八.rediskey过期机制


一、redis

  1. RedisTemplate和StringRedisTemplate的区别

    当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,
    那么你就使用StringRedisTemplate即可。

     

 

二、使用步骤

Ⅰ.RedisTemplate

1.引入库

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.配置RedisConfig

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        // 设置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        // 设置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());
        // 设置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置hash的value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());

        template.afterPropertiesSet();
        return template;
    }

}

Ⅱ StringRedisTemplate

  1. 在redis中以Json字符串的格式存储,需要解析
    String cateJSON = redisTemplate.opsForValue().get("cateJSON");
            if (!StringUtils.isEmpty(cateJSON)) {
                Map<String, List<Catelog2Vo>> result = JSON.parseObject(cateJSON, new TypeReference<Map<String, List<Catelog2Vo>>>() {
                });
                return result;
            }

     

三、项目:

Ⅰ 点赞统计Set

  1. redis key的生成工具类

     
    根据帖子的类型和Id进行key的保存
    
    private static final String SPLIT = ":";
        private static final String PREFIX_ENTITY_LIKE = "like:entity"; 
     // 某个实体的赞
        // like:entity:entityType:entityId -> set(userId)
        public static String getEntityLikeKey(int entityType, int entityId) {
            return PREFIX_ENTITY_LIKE + SPLIT + entityType + SPLIT + entityId;
        }

     

  2.  点赞和收到的总赞逻辑(两次不同的redis操作,开启事务)

      //将点赞的用户Id以set的集合进行存储,点赞或者取消
     public void like(int userId, int entityType, int entityId, int entityUserId) {
            redisTemplate.execute(new SessionCallback() {
                @Override
                public Object execute(RedisOperations operations) throws DataAccessException {
                    String entityLikeKey = RedisKeyUtil.getEntityLikeKey(entityType, entityId);
                    String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
    
                    boolean isMember = operations.opsForSet().isMember(entityLikeKey, userId);
                    //开启事务,查询放到事务之前
                    operations.multi();
    
                    if (isMember) {
                        operations.opsForSet().remove(entityLikeKey, userId);
                        //收到的总赞,减1
                        operations.opsForValue().decrement(userLikeKey);
                    } else {
                        operations.opsForSet().add(entityLikeKey, userId); 
                         //收到的总赞,加1
                        operations.opsForValue().increment(userLikeKey);
                    }
    
                    return operations.exec();
                }
            });
        }

     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值