备案网站可以做论坛么,营销型网站建设定制,申请邮箱163免费注册,wordpress电商Redis的学习专栏#xff1a;http://t.csdnimg.cn/a8cvV 许多应用都会使用Redis作为计数的基本工具#xff0c;可以实现快速计数、查询缓存的功能#xff0c;同时数据也可以异步处理。例如#xff1a;博客浏览#xff0c;用户每查看一次#xff0c;就会增加一次的访问量http://t.csdnimg.cn/a8cvV 许多应用都会使用Redis作为计数的基本工具可以实现快速计数、查询缓存的功能同时数据也可以异步处理。例如博客浏览用户每查看一次就会增加一次的访问量手机验证码一分钟之内只能发送一次
普通的计数器有很多bug比如访问量计数方式呢阅读程度呢总不可能一刷新就增加一次吧
解决方法在规定时间内一个用户不能超过规定只能访问一次。而这种情况我们可以先将数据存储在主存里然后同步到数据库当中。
方法
先初始化一下RedisTemplate这个是操作redis的第三方库我们先要对他初始化一下重新序列化 Autowiredprivate StringRedisTemplate stringRedisTemplate;Configuration
public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplateString, Object redisTemplate new RedisTemplate();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());// 这个地方不可使用 json 序列化如果使用的是ObjectRecord传输对象时可能会有问题会出现一个 java.lang.IllegalArgumentException: Value must not be null! 错误redisTemplate.setHashValueSerializer(RedisSerializer.string());return redisTemplate;}
}2.访问 /*** 利用redis做计数器* 可以处理业务上面的的一些访问次数之类的* 例如文章的点赞数阅读量允许有一点的延迟效果先保存到redis中然后在同步到数据库当中*/RequestMapping(hello)public void count() {/*** 判断是否到达次数*/Boolean aBoolean invokeExceededTimes(time_key2,1,3);if (aBoolean) {LOGGER.info(可以访问);}else {LOGGER.info(请求次数达标了);}}/*** 判断同一个key在规定时间内访问次数是否到达了最高值* param key 键* param days 时间* param count 一定时间内的访问次数* return*/public Boolean invokeExceededTimes(String key, int days, int count) {LOGGER.info(key值:{},key);// 判断在redis中是否有key值Boolean redisKey stringRedisTemplate.hasKey(key);if (redisKey) {// 获取key所对应的valueInteger hasKey Integer.parseInt((String)stringRedisTemplate.opsForValue().get(key));if (hasKey count) {return false;}// 对value进行加1操作stringRedisTemplate.opsForValue().increment(key,1);return true;}else {// 如果没有key值对他进行添加到redis中stringRedisTemplate.opsForValue().set(key,1,days,TimeUnit.DAYS);}return true;}我们设置每一个Redis当中的KEY值如果KEY当中的值超过固定次数则不会再自增了而一旦过了存活时间之后就可以再次访问了。
RedisTemplate 常用方法
Boolean expire(K key, final long timeout, final TimeUnit unit) 为指定的 key 指定缓存失效时间。时间一到 key 会被移除。key 不存在时不影响Boolean expireAt(K key, final Date date) 设置 key 失效日期。注意如果 key 后续被重新设置值比如 set key value则 key 过期时间失效需要重新设置。Long getExpire(K key) 获取 key 的剩余过期时间。 -1 表示永久有效。-2 表示 key 不存在。Long getExpire(K key, final TimeUnit timeUnit) 获取 key 的剩余过期时间并换算成指定的时间单位 Boolean hasKey(K key) 判断 key 是否存在Boolean delete(K key) 删除指定的 keyLong delete(Collection keys) 删除多个 keyRedisSerializer? getDefaultSerializer() 获取默认的序列化方式。RedisTemplate 是 JdkSerializationRedisSerializerSet keys(K pattern) 获取整个库下符合指定正则的所有 key如 keys(*) 获取所有 keyBoolean move(K key, final int dbIndex)将 key 从当前库移动目标库 dbIndexClusterOperationsK, V opsForCluster() 获取 ClusterOperations 用于操作集群GeoOperationsK, V opsForGeo() 获取 GeoOperations 用于操作地图redisTemplate.getConnectionFactory().getConnection().flushAll();//清空 redis 所有数据库(all databases)中的所有数据(all keys)redisTemplate.getConnectionFactory().getConnection().flushDb();清空 redis 当前连接的数据库(selected database)中的所有数据(all keys) 还有很多很多方法需要时再去找、使用。