整合spring-data-redis以及redisTemplate的使用
一.导入依赖配置
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.4.RELEASE</version>
</dependency>
二.xml配置
2.1 配置jedisPoolConfig
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${nosql.pool.maxIdle}" />
<property name="maxTotal" value="${nosql.pool.maxTotal}" />
<property name="maxWaitMillis" value="${nosql.pool.maxWaitMillis}" />
<property name="testOnBorrow" value="${nosql.pool.testOnBorrow}" />
</bean>
2.2 配置jedisConnectionFactory
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${jedis.host}" />
<property name="port" value="${jedis.port}" />
<!-- <property name="password" value="${jedis.password}" />--><!--Err:数据库没有密码不需要配-->
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
2.3 配置redisTemplate
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
</bean>
2.4 读取配置文件
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 对于读取一个配置文件采取的方案 --> <!-- 对于读取两个以上配置文件采取的处理方案 -->
<property name="locations">
<list>
<value>classpath:db.properties</value>
<value>classpath:redis.properties</value>
</list>
</property>
</bean>
三.使用redisTemplate
package com.wang.service.Impl; import com.wang.service.RateLimiterService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.List; @Service
public class RateLimiterServiceImpl implements RateLimiterService { @Autowired
private RedisTemplate redisTemplate;
@SuppressWarnings("unchecked")
public boolean acquire(String key, Integer permits, long currMillSecond,String max_permits,String rateStr) {
try {
//针对新用户创建令牌桶
if (!redisTemplate.hasKey(key)) {
redisTemplate.opsForHash().put(key, "last_mill_second", String.valueOf(currMillSecond));
redisTemplate.opsForHash().put(key, "curr_permits", "0");
redisTemplate.opsForHash().put(key, "max_permits", max_permits);
redisTemplate.opsForHash().put(key, "rate",rateStr);
return true;
}
//获取令牌桶信息,上一个令牌时间,当前可用令牌数,最大令牌数,令牌消耗速率
List<Object> keys = new ArrayList<Object>();
keys.add("last_mill_second");
keys.add("curr_permits");
keys.add("max_permits");
keys.add("rate");
List<Object> strings = redisTemplate.opsForHash().multiGet(key,keys);
long lastMillSecond = Long.parseLong(strings.get(0).toString());
Integer currPermits = Integer.valueOf(strings.get(1).toString());
Integer maxPermits = Integer.valueOf(strings.get(2).toString());
Double rate = Double.valueOf(strings.get(3).toString());
//向桶里面添加令牌
Double reversePermitsDouble = ((currMillSecond - lastMillSecond) / 1000) * rate; Integer reversePermits = reversePermitsDouble.intValue();
Integer expectCurrPermits = reversePermits + currPermits;
Integer localCurrPermits = Math.min(expectCurrPermits, maxPermits);
//添加令牌之后更新时间
if (reversePermits > 0) {
redisTemplate.opsForHash().put(key, "last_mill_second", String.valueOf(currMillSecond));
}
//判断桶里面剩余的令牌数目
if (localCurrPermits - permits >= 0) {
redisTemplate.opsForHash().put(key, "curr_permits", String.valueOf(localCurrPermits - permits));
return true;
} else { redisTemplate.opsForHash().put(key, "curr_permits", String.valueOf(localCurrPermits));
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
相关链接:如何使用RedisTemplate访问Redis数据结构
整合spring-data-redis以及redisTemplate的使用的更多相关文章
- Spring Data Redis 让 NoSQL 快如闪电 (1)
[编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...
- Spring Data Redis 的坑
用 Spring data redis 的redisTemplate存储数据的时候发现,它的键值前多出现了字符串:\xac\xed\x00\x05t\x00\x03 如本来key=name,会变成&q ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- spring data redis RedisTemplate操作redis相关用法
http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...
- Spring Data Redis入门示例:基于RedisTemplate (三)
使用底层API:RedisConnection操作Redis,需要对数据进行手动转换(String <---->byte),需要进行多数重复性工作,效率低下:org.springframe ...
- Redis与Spring Data Redis
1.Redis概述 1.1介绍 官网:https://redis.io/ Redis是一个开源的使用ANSIC语言编写.支持网络.可基于内存 亦可持久化的日志型.Key-Value型的高性能数据库. ...
- Spring Data Redis Stream的使用
一.背景 Stream类型是 redis5之后新增的类型,在这篇文章中,我们实现使用Spring boot data redis来消费Redis Stream中的数据.实现独立消费和消费组消费. 二. ...
- spring data redis使用示例
1. 配置依赖文件 <dependencies> <dependency> <groupId>org.springframework.data</groupI ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
随机推荐
- Visio高级应用部件
标注与公式的应用: 插入标注 怎么让标注与图形建立关联:拖动标注的时候坐下角会出现黄色的点 把标准拖动到形状边的时候让黄点进入形状就是建立了关联 然后标注就会随着形状的移动而移动 而且复制和删除也都是 ...
- Kubernetes从私有镜像仓库中拉取镜像
当我们尝试从私有仓库中拉取镜像时,可能会收到这样提示:requested access to the resource is denied Error response from daemon: pu ...
- 使用spring boot中的JPA操作数据库
前言 Spring boot中的JPA 使用的同学都会感觉到他的强大,简直就是神器一般,通俗的说,根本不需要你写sql,这就帮你节省了很多时间,那么下面我们来一起来体验下这款神器吧. 一.在pom中添 ...
- 小白进阶之路-python基本运算符
1.算数运算符(+.-.*./.%.**(幂 二次方.三次方).//(地板除,返回商的整数部分) 2.比较运算符(==.!=.<>(不等于).>.<.>=.<=) ...
- Python 进程、线程、协程的介绍与使用
一.必备的理论基础 二.操作系统发展史 三.进程理论 四.线程理论 五.协程 一.必备的理论基础 操作系统理论: 操作系统是一个协调\管理\控制计算机硬件资源与应用软件资源的控制程序 操作系统的两大功 ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- Lincode刷题No.8
8.Rotate String lintcode 题解1: class Solution { public: /** * @param str: An array of char * @param o ...
- 输入n个学生,并且输入成绩,判断是否偏科
H学校的领导主任决定分析一下今年所有N名学生的考试成绩,从中找出偏科的学生,考试成绩包含语文,数学,英语三门课程的分数,已知偏科的定义是:某一门课程的分数大于等于90,并且另外两门的分数小于等于70. ...
- 3maven常用命令和配置依赖
依赖: 例:spring-context.jar 依赖 spring-aop.jar... A中的某些类 需要使用B中的某些类,则称为A依赖于B 在maven项目中,如果要使用 一个当时存在的Jar或 ...
- NOIP提高组2018试题解析 目录
重磅来袭! 本蒟蒻准备挑战一下NOIP2018提高组的试题啦(怎么办 我猜我连10分都拿不了) 目录: Day1 1.铺设道路 讲解 得分:100 2.货币系统 讲解 3.赛道修建 讲解 ...