您的位置 首页 java

Java中使用Redis

图片挂了可以看着: java 中使用 Redis

redis的安装(windows)

安装版和解压版,解压版需要配置环境变量

下载地址 :

启动redis

cmd窗口中输入 redis-server.exe (确保redis路径已加入环境变量中)

Java中使用Redis

启动成功后显示,此窗口关闭redis服务器也就会关闭 默认端口6379

连接redis

Java中使用Redis

此时打开另一个cmd窗口,输入 redis-cli.exe -h 127.0.0.1 -p 6379

显示host和端口号即为成功

简单的redis操作可以参考

java中利用jedis连接redis

maven 依赖如下 此处为 jdk 1.7 redis3.2 jedis2.4是没有问题的(如有报错尝试更换版本)

<!– 引入redis客户端依赖 –>

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.4.2</version>

</dependency>

测试类如下

package com.zzipsun.test;

import java.util. iterator ;

import java.util.List;

import java.util.Map;

import java.util.Set;

import redis.clients.jedis.Jedis;

/**

* @author zs

*/

public class RedisTest {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis(“localhost”);

System.out.println(“连接成功”);

//查看服务是否运行

System.out.println(“服务正在运行: “+jedis.ping());

//存储数据到列表中

jedis.lpush(“site-list”, “Runoob”);

jedis.lpush(“site-list”, ” Google “);

jedis.lpush(“site-list”, “Taobao”);

// 获取存储的数据并输出

List<String> list = jedis.lrange(“site-list”, 0 ,0);

for(int i=0; i<list.size(); i++) {

System.out.println(“列表项为: “+list.get(i));

}

// 获取数据并输出

Set<String> keys = jedis.keys(“*”);

Iterator <String> it=keys.iterator() ;

while(it.hasNext()){

String key = it.next();

System.out.println(key);

}

}

}

成功输出即为连接成功

spring集成redis

(1)

(此处因与 spring (4.1)版本和redis-client(2.4.2)版本可能会出现较多问题,此处版本组合是没有问题的,如有问题尝试更换版本…)

引入spring-data-redis.jar包

<!– spring-redis实现 –>

<dependency>

<groupId>org.springframework.data</groupId>

<artifactId>spring-data-redis</artifactId>

<version>1.3.4.RELEASE</version>

</dependency>

(2)

redis.properties 配置文件

#访问地址

host=127.0.0.1

#访问端口

port=6379

#注意,如果没有password,此处不设置值,但这一项要保留

password=

#数据库下标

dbIndex=0

#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。

maxIdle=300

#连接池的最大数据库连接数。设为0表示无限制

maxActive=600

#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。

maxWait=1000

#在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的;

testOnBorrow=true

(3)

spring-redis配置文件(此处包含了数据库和 mybatis 的配置)

<?xml version=”1.0″ encoding=”UTF-8″?>

<beans xmlns=”#34;

xmlns:xsi=”#34;

xmlns:context=”#34;

xmlns: jdbc =”#34;

xmlns:jee=”#34;

xmlns:tx=”#34;

xmlns:aop=”#34;

xmlns:mvc=”#34;

xmlns:util=”#34;

xmlns:jpa=”#34;

xsi:schemaLocation=”

#34;>

<!– 配置 spring-mybatis.xml –>

<!– 读取配置文件 –>

<util:properties id=”redis”

location=”classpath:conf/redis.properties”/>

<util:properties id=”jdbc”

location=”classpath:conf/jdbc.properties”/>

<!– 配置 数据库连接池 –>

<bean id=”dataSource”

class=”org.apache.commons.dbcp.BasicDataSource”

destroy-method=”close”>

<property name=”driverClassName”

value=”#{jdbc.driver}”/>

<property name=”url”

value=”#{jdbc.url}”/>

<property name=”username”

value=”#{jdbc.user}”/>

<property name=”password”

value=”#{jdbc.password}”/>

<property name=”maxIdle”

value=”#{jdbc.maxIdle}”/>

<property name=”maxWait”

value=”#{jdbc.maxWait}”/>

<property name=”maxActive”

value=”#{jdbc.maxActive}”/>

<property name=”defaultAutoCommit”

value=”#{jdbc.defaultAutoCommit}”/>

<property name=”defaultReadOnly”

value=”#{jdbc.defaultReadOnly}”/>

<property name=”testOnBorrow”

value=”#{jdbc.testOnBorrow}”/>

<property name=”validationQuery”

value=”#{jdbc.validationQuery}”/>

</bean>

<!– 配置MyBatis的 Session Factory –>

<bean id=”sqlSessionFactory”

class=”org.mybatis.spring.SqlSessionFactoryBean”>

<property name=”dataSource”

ref=”dataSource”/>

<property name=”mapperLocations”

value=”classpath:mapper/*.xml”/>

</bean>

<!– Mapper接口组件扫描 –>

<bean class=”org.mybatis.spring.mapper.MapperScannerConfigurer”>

<property name=”basePackage”

value=”com.zzipsun.dao”/>

</bean>

<!– transaction config related… –>

<bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”>

<property name=”dataSource”

ref=”dataSource”/>

</bean>

<!– 设置 注解驱动的事务管理 –>

<tx: annotation -driven

transaction-manager=”txManager”/>

<!– redis config start –>

<!– 配置JedisPoolConfig实例 –>

<bean id=”poolConfig” class=”redis.clients.jedis.JedisPoolConfig”>

<property name=”maxIdle” value=”#{redis.maxIdle}” />

<property name=”maxTotal” value=”#{redis.maxActive}” />

<property name=”maxWaitMillis” value=”#{redis.maxWait}” />

<property name=”testOnBorrow” value=”#{redis.testOnBorrow}” />

</bean>

<!– 配置JedisConnectionFactory –>

<bean id=”jedisConnectionFactory”

class=”org.springframework.data.redis.connection.jedis.JedisConnectionFactory”>

<property name=”hostName” value=”#{redis.host}” />

<property name=”port” value=”#{redis.port}” />

<!– <property name=”password” value=”#{redis.password}” /> –>

<property name=”database” value=”#{redis.dbIndex}” />

<property name=”poolConfig” ref=”poolConfig” />

</bean>

<!– 配置RedisTemplate –>

<bean id=”redisTemplate” class=”org.springframework.data.redis.core.RedisTemplate”>

<property name=”connectionFactory” ref=”jedisConnectionFactory” />

<!– 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can’t cast to String!!!–>

<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>

<!–自定义redis工具类,在需要缓存的地方注入此类 –>

<bean id=”redisUtil” class=”com.zzipsun.util.RedisUtil”>

<property name=”redisTemplate” ref=”redisTemplate” />

</bean>

</beans>

(4)

redis工具类(此处try catch为防止redis宕机等问题时 方法可以继续执行)

package com.zzipsun.util;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.concurrent.TimeUnit;

import org.springframework.data.redis.core.RedisTemplate;

import org.springframework.stereotype.Component;

import org.springframework.util.CollectionUtils;

/**

*

* @author

* 基于spring和redis的redisTemplate工具类

* 针对所有的 hash 都是以h开头的方法

* 针对所有的Set 都是以s开头的方法 不含通用方法

* 针对所有的List 都是以l开头的方法

*/

@Component(“redisUtil”)

public class RedisUtil {

private RedisTemplate<String, Object> redisTemplate;

public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {

this.redisTemplate = redisTemplate;

}

//=============================common============================

/**

* 指定缓存失效时间

* @param key 键

* @param time 时间(秒)

* @return

*/

public boolean expire(String key,long time){

try {

if(time>0){

redisTemplate.expire(key, time, TimeUnit.SECONDS);

}

return true;

} catch ( Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 根据key 获取过期时间

* @param key 键 不能为null

* @return 时间(秒) 返回0代表为永久有效

*/

public long getExpire(String key){

return redisTemplate.getExpire(key,TimeUnit.SECONDS);

}

/**

* 判断key是否存在

* @param key 键

* @return true 存在 false不存在

*/

public boolean hasKey(String key){

try {

return redisTemplate.hasKey(key);

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 删除缓存

* @param key 可以传一个值 或多个

*/

@SuppressWarnings(“unchecked”)

public void del(String … key){

if(key!=null&&key.length>0){

if(key.length==1){

redisTemplate.delete(key[0]);

}else{

redisTemplate.delete(CollectionUtils.arrayToList(key));

}

}

}

//============================String=============================

/**

* 普通缓存获取

* @param key 键

* @return 值

*/

public Object get(String key){

return key==null?null:redisTemplate.opsForValue().get(key);

}

/**

* 普通缓存放入

* @param key 键

* @param value 值

* @return true成功 false失败

*/

public boolean set(String key,Object value) {

try {

redisTemplate.opsForValue().set(key, value);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 普通缓存放入并设置时间

* @param key 键

* @param value 值

* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期

* @return true成功 false 失败

*/

public boolean set(String key,Object value,long time){

try {

if(time>0){

redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);

}else{

set(key, value);

}

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 递增

* @param key 键

* @param by 要增加几(大于0)

* @return

*/

public long incr(String key, long delta){

if(delta<0){

throw new RuntimeException(“递增因子必须大于0”);

}

return redisTemplate.opsForValue().increment(key, delta);

}

/**

* 递减

* @param key 键

* @param by 要减少几(小于0)

* @return

*/

public long decr(String key, long delta){

if(delta<0){

throw new RuntimeException(“递减因子必须大于0”);

}

return redisTemplate.opsForValue().increment(key, -delta);

}

//================================Map=================================

/**

* HashGet

* @param key 键 不能为null

* @param item 项 不能为null

* @return 值

*/

public Object hget(String key,String item){

try {

return redisTemplate.opsForHash().get(key, item);

} catch (Exception e) {

return null;

}

}

/**

* 获取hashKey对应的所有键值

* @param key 键

* @return 对应的多个键值

*/

public Map<Object,Object> hmget(String key){

return redisTemplate.opsForHash().entries(key);

}

/**

* HashSet

* @param key 键

* @param map 对应多个键值

* @return true 成功 false 失败

*/

public boolean hmset(String key, Map<String,Object> map){

try {

redisTemplate.opsForHash().putAll(key, map);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* HashSet 并设置时间

* @param key 键

* @param map 对应多个键值

* @param time 时间(秒)

* @return true成功 false失败

*/

public boolean hmset(String key, Map<String,Object> map, long time){

try {

redisTemplate.opsForHash().putAll(key, map);

if(time>0){

expire(key, time);

}

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 向一张hash表中放入数据,如果不存在将创建

* @param key 键

* @param item 项

* @param value 值

* @return true 成功 false失败

*/

public boolean hset(String key,String item,Object value) {

try {

redisTemplate.opsForHash().put(key, item, value);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 向一张hash表中放入数据,如果不存在将创建

* @param key 键

* @param item 项

* @param value 值

* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间

* @return true 成功 false失败

*/

public boolean hset(String key,String item,Object value,long time) {

try {

redisTemplate.opsForHash().put(key, item, value);

if(time>0){

expire(key, time);

}

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 删除hash表中的值

* @param key 键 不能为null

* @param item 项 可以使多个 不能为null

*/

public void hdel(String key, Object… item){

redisTemplate.opsForHash().delete(key,item);

}

/**

* 判断hash表中是否有该项的值

* @param key 键 不能为null

* @param item 项 不能为null

* @return true 存在 false不存在

*/

public boolean hHasKey(String key, String item){

return redisTemplate.opsForHash().hasKey(key, item);

}

/**

* hash递增 如果不存在,就会创建一个 并把新增后的值返回

* @param key 键

* @param item 项

* @param by 要增加几(大于0)

* @return

*/

public double hincr(String key, String item,double by){

return redisTemplate.opsForHash().increment(key, item, by);

}

/**

* hash递减

* @param key 键

* @param item 项

* @param by 要减少记(小于0)

* @return

*/

public double hdecr(String key, String item,double by){

return redisTemplate.opsForHash().increment(key, item,-by);

}

//============================set=============================

/**

* 根据key获取Set中的所有值

* @param key 键

* @return

*/

public Set<Object> sGet(String key){

try {

return redisTemplate.opsForSet().members(key);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 根据value从一个set中查询,是否存在

* @param key 键

* @param value 值

* @return true 存在 false不存在

*/

public boolean sHasKey(String key,Object value){

try {

return redisTemplate.opsForSet().isMember(key, value);

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 将数据放入set缓存

* @param key 键

* @param values 值 可以是多个

* @return 成功个数

*/

public long sSet(String key, Object…values) {

try {

return redisTemplate.opsForSet().add(key, values);

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

/**

* 将set数据放入缓存

* @param key 键

* @param time 时间(秒)

* @param values 值 可以是多个

* @return 成功个数

*/

public long sSetAndTime(String key,long time,Object…values) {

try {

Long count = redisTemplate.opsForSet().add(key, values);

if(time>0) expire(key, time);

return count;

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

/**

* 获取set缓存的长度

* @param key 键

* @return

*/

public long sGetSetSize(String key){

try {

return redisTemplate.opsForSet().size(key);

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

/**

* 移除值为value的

* @param key 键

* @param values 值 可以是多个

* @return 移除的个数

*/

public long setRemove(String key, Object …values) {

try {

Long count = redisTemplate.opsForSet().remove(key, values);

return count;

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

//===============================list=================================

/**

* 获取list缓存的内容

* @param key 键

* @param start 开始

* @param end 结束 0 到 -1代表所有值

* @return

*/

public List<Object> lGet(String key,long start, long end){

try {

return redisTemplate.opsForList().range(key, start, end);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 获取list缓存的长度

* @param key 键

* @return

*/

public long lGetListSize(String key){

try {

return redisTemplate.opsForList().size(key);

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

/**

* 通过索引 获取list中的值

* @param key 键

* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推

* @return

*/

public Object lGetIndex(String key,long index){

try {

return redisTemplate.opsForList().index(key, index);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 将list放入缓存

* @param key 键

* @param value 值

* @param time 时间(秒)

* @return

*/

public boolean lSet(String key, Object value) {

try {

redisTemplate.opsForList().rightPush(key, value);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 将list放入缓存

* @param key 键

* @param value 值

* @param time 时间(秒)

* @return

*/

public boolean lSet(String key, Object value, long time) {

try {

redisTemplate.opsForList().rightPush(key, value);

if (time > 0) expire(key, time);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 将list放入缓存

* @param key 键

* @param value 值

* @param time 时间(秒)

* @return

*/

public boolean lSet(String key, List<Object> value) {

try {

redisTemplate.opsForList().rightPushAll(key, value);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 将list放入缓存

* @param key 键

* @param value 值

* @param time 时间(秒)

* @return

*/

public boolean lSet(String key, List<Object> value, long time) {

try {

redisTemplate.opsForList().rightPushAll(key, value);

if (time > 0) expire(key, time);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 根据索引修改list中的某条数据

* @param key 键

* @param index 索引

* @param value 值

* @return

*/

public boolean lUpdateIndex(String key, long index,Object value) {

try {

redisTemplate.opsForList().set(key, index, value);

return true;

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 移除N个值为value

* @param key 键

* @param count 移除多少个

* @param value 值

* @return 移除的个数

*/

public long lRemove(String key,long count,Object value) {

try {

Long remove = redisTemplate.opsForList().remove(key, count, value);

return remove;

} catch (Exception e) {

e.printStackTrace();

return 0;

}

}

}

(5)

将spring-redis.xml包含到web.xml中

<servlet>

<description></description>

<display-name>DispatcherServlet</display-name>

<servlet-name>DispatcherServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<description></description>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:conf/spring-*.xml</param-value> –此处包含所有spring配置文件

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

(6)

在需要redis的业务类中注入redisUtil

此处用一个方法理解redis的使用

/**

* ArticleServiceImp.java

*/

package com.zzipsun.service.imp;

import java.sql.Array;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import javax.annotation.Resource;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Service;

import com.zzipsun.dao.ArticleDao;

import com.zzipsun.entity.Article;

import com.zzipsun.service.base.ArticleService;

import com.zzipsun.util.Log4JUtil;

import com.zzipsun.util.RedisUtil;

/**

* @author zs

*

*/

@Service(“articleService”)

public class ArticleServiceImp implements ArticleService {

Logger log=Logger.getLogger(ArticleServiceImp.class);

@Resource

ArticleDao articleDao;

@Value(“#{jdbc.pagesize}”)

int pageSize;

@Resource

RedisUtil redisUtil;

/* (non-Javadoc)

* @see com.zzipsun.service.base.ArticleService#findArticleById(java.lang.String)

*/

//查看一个文章

public Article findArticleById(String articleId) {

if(articleId.trim()==””||articleId==null) {

throw new RuntimeException(“您查看的文章找不到了”);

}

//尝试从redis缓冲中获取map中的article实体对象

Article article=(Article)redisUtil.hget(“article”, articleId);

if(article!=null) {

log.debug(“redis中的id为”+articleId+”的article标题为”+article.getTitle());

}

//如果redis缓存中不存在此文章

if(article==null) {

//数据库查询

article=articleDao.findArticleById(articleId);

//存入redis中

redisUtil.hset(“article”, articleId, article);

}

return article;

}

}

新手最大的问题就是版本问题,可以多百度

文章来源:智云一二三科技

文章标题:Java中使用Redis

文章地址:https://www.zhihuclub.com/175989.shtml

关于作者: 智云科技

热门文章

网站地图