一.导入依赖配置

 <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的使用的更多相关文章

  1. Spring Data Redis 让 NoSQL 快如闪电 (1)

    [编者按]本文作者为 Xinyu Liu,详细介绍了 Redis 的特性,并辅之以丰富的用例.在本文的第一部分,将重点概述 Redis 的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈 ...

  2. Spring Data Redis 的坑

    用 Spring data redis 的redisTemplate存储数据的时候发现,它的键值前多出现了字符串:\xac\xed\x00\x05t\x00\x03 如本来key=name,会变成&q ...

  3. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  4. Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

    一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...

  5. spring data redis RedisTemplate操作redis相关用法

    http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

  6. Spring Data Redis入门示例:基于RedisTemplate (三)

    使用底层API:RedisConnection操作Redis,需要对数据进行手动转换(String <---->byte),需要进行多数重复性工作,效率低下:org.springframe ...

  7. Redis与Spring Data Redis

    1.Redis概述 1.1介绍 官网:https://redis.io/ Redis是一个开源的使用ANSIC语言编写.支持网络.可基于内存 亦可持久化的日志型.Key-Value型的高性能数据库. ...

  8. Spring Data Redis Stream的使用

    一.背景 Stream类型是 redis5之后新增的类型,在这篇文章中,我们实现使用Spring boot data redis来消费Redis Stream中的数据.实现独立消费和消费组消费. 二. ...

  9. spring data redis使用示例

    1. 配置依赖文件 <dependencies> <dependency> <groupId>org.springframework.data</groupI ...

  10. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

随机推荐

  1. 循环语句作业与循环补充(continue与break)

    作业: 1.使用while循环输入1 2 3 4 5 6 8 9 10(没有7) n = 1 while n < 11: if n == 7: pass else: print(n) n = n ...

  2. 驾驭git merge——git merge的规范化操作

    这两天负责将一个开发了较长时间,代码量数万行的C语言项目(A项目)的代码分支合并到主线.由于之前参与过一些其他项目分支收编时采用git merge引入问题的修改,个人从心理上对git merge有所抵 ...

  3. DEVOPS技术实践_21:Pipeline的嵌套以及流程控制的if和case语句

    1 if控制语句 使用一个简单的If控制语句 pipeline { agent any stages { stage('flow control') { steps { script { == ) { ...

  4. wide&deep模型演化

    推荐系统模型演化 LR-->GBDT+LR FM-->FFM-->GBDT+FM|FFM FTRL-->GBDT+FTRL Wide&DeepModel (Deep l ...

  5. 洛谷$P2153\ [SDOI2009]$ 晨跑 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 题目好长昂,,,大概概括下$QwQ$.就说有$n$个节点$m$条边,然后要求每次走的路径都不一样,问最多能走多少次,然后在次数最多的前提下问路径最短是多少$ ...

  6. $POJ$3252 $Round\ Numbers$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 沉迷写博客,,,不想做题,,,$QAQ$口胡一时爽一直口胡一直爽$QAQ$ 先港下题目大意嗷$QwQ$大概就说,给定区间$[l,r]$,求区间内满足二进制 ...

  7. 使用wordPress搭建个人博客

    第一章:前期准备工作 ​ 现在比较流行的博客社区有博客园.开源中国.思否.掘金.CSDN.简书等等,平时可以在自己喜欢的社区分享交流相关专业知识.如果你想拥有一个自己的博客,下面就跟我一起了解一下,我 ...

  8. 洛谷P1832 A+B Problem(再升级) 题解 完全背包方案计数

    题目链接:https://www.luogu.com.cn/problem/P1832 题目大意: 给定一个正整数n,求将其分解成若干个素数之和的方案总数. 解题思路: 首先找到所有 \(\le n\ ...

  9. Linux开发环境及应用—《第五周单元测验》《第六周单元测验》

    1.与windows中"格式化磁盘"功能相对应的Linux命令是 mkfs 2.在Linux文件系统中,文件名也存放在磁盘上,存放于磁盘的下述哪个区域 文件存储区 3.传统Linu ...

  10. python利用scapy嗅探流量

    能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地       def sniff(count=0, st ...