zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

详解SSH框架和Redis的整合

Redisssh框架 详解 整合
2023-06-13 09:19:50 时间

一个已有的Struts+Spring+Hibernate项目,以前使用MySQL数据库,现在想把Redis也整合进去。

1. 相关Jar文件

下载并导入以下3个Jar文件:

commons-pool2-2.4.2.jar、jedis-2.3.1.jar、spring-data-redis-1.3.4.RELEASE.jar。

2. Redis配置文件

在src文件夹下面新建一个redis.properties文件,设置连接Redis的一些属性。

redis.host=127.0.0.1
redis.port=6379
redis.default.db=1
redis.timeout=100000
redis.maxActive=300
redis.maxIdle=100
redis.maxWait=1000
redis.testOnBorrow=true

再新建一个redis.xml文件。


 xml version="1.0" encoding="UTF-8" 

 beans xmlns="http://www.springframework.org/schema/beans" 

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

 xmlns:p="http://www.springframework.org/schema/p" 

 xmlns:context="http://www.springframework.org/schema/context" 

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 

 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd" 

 context:property-placeholder location="classpath:redis.properties"/ 

 bean id="propertyConfigurerRedis" 

 property name="order" value="1" / 

 property name="ignoreUnresolvablePlaceholders" value="true" / 

 property name="systemPropertiesMode" value="1" / 

 property name="searchSystemEnvironment" value="true" / 

 property name="locations" 

 list 

 value classpath:redis.properties /value 

 /list 

 /property 

 /bean 

 bean id="jedisPoolConfig" 

 property name="maxIdle" value="${redis.maxIdle}" / 

 property name="testOnBorrow" value="${redis.testOnBorrow}" / 

 /bean 

 bean id="jedisConnectionFactory" 

 property name="usePool" value="true" /property 

 property name="hostName" value="${redis.host}" / 

 property name="port" value="${redis.port}" / 

 property name="timeout" value="${redis.timeout}" / 

 property name="database" value="${redis.default.db}" /property 

 constructor-arg index="0" ref="jedisPoolConfig" / 

 /bean 

 bean id="redisTemplate" 

 p:connectionFactory-ref="jedisConnectionFactory" 

 /bean 

 bean id="redisBase" abstract="true" 

 property name="template" ref="redisTemplate"/ 

 /bean 

 context:component-scan base-package="com.school.redisclient" / 

 /beans 

3. Redis类

新建一个com.school.redisclient包,结构如下:

接口IRedisService:


public interface IRedisService K, V { 

 public void set(K key, V value, long expiredTime); 

 public V get(K key);

 public Object getHash(K key, String name);

 public void del(K key); 

抽象类AbstractRedisService,主要是对RedisTemplate进行操作:


public abstract class AbstractRedisService K, V implements IRedisService K, V { 

 @Autowired 

 private RedisTemplate K, V redisTemplate; 

 public RedisTemplate K, V getRedisTemplate() { 

 return redisTemplate; 

 public void setRedisTemplate(RedisTemplate K, V redisTemplate) { 

 this.redisTemplate = redisTemplate; 

 @Override 

 public void set(final K key, final V value, final long expiredTime) { 

 BoundValueOperations K, V valueOper = redisTemplate.boundValueOps(key); 

 if (expiredTime = 0) { 

 valueOper.set(value); 

 } else { 

 valueOper.set(value, expiredTime, TimeUnit.MILLISECONDS); 

 @Override 

 public V get(final K key) { 

 BoundValueOperations K, V valueOper = redisTemplate.boundValueOps(key); 

 return valueOper.get(); 

 @Override 

 public Object getHash(K key, String name){

 Object res = redisTemplate.boundHashOps(key).get(name);

 return res;

 @Override 

 public void del(K key) { 

 if (redisTemplate.hasKey(key)) { 

 redisTemplate.delete(key); 

实现类RedisService:


@Service("redisService") 

public class RedisService extends AbstractRedisService String, String { 

}

工具类RedisTool:


public class RedisTool { 

 private static ApplicationContext factory;

 private static RedisService redisService;

 public static ApplicationContext getFactory(){

 if (factory == null){

 factory = new ClassPathXmlApplicationContext("classpath:redis.xml");

 return factory;

 public static RedisService getRedisService(){

 if (redisService == null){

 redisService = (RedisService) getFactory().getBean("redisService");

 return redisService;

4. 查询功能的实现

新建一个Action:RClasQueryAction,返回Redis里面所有的课程数据。


@SuppressWarnings("serial")

public class RClasQueryAction extends ActionSupport {

 RedisService rs = RedisTool.getRedisService();

 List Clas claslist = new ArrayList Clas 

 Clas c;

 public String execute(){

 if (rs != null){

 System.out.println("RedisService : " + rs);

 getAllClas();

 ServletActionContext.getRequest().setAttribute("claslist", claslist);

 return SUCCESS;

 private void getAllClas(){

 claslist = new ArrayList Clas 

 int num = Integer.parseInt(rs.get("clas:count"));

 for (int i=0; i i++){

 String cid = "clas:" + (i+1);

 c = new Clas();

 int id = Integer.parseInt(String.valueOf(rs.getHash(cid, "ID")));

 c.setId(id);

 System.out.println("ID:" + id);

 String name = (String) rs.getHash(cid, "NAME");

 c.setName(name);

 System.out.println("NAME:" + name);

 String comment = (String) rs.getHash(cid, "COMMENT");

 c.setComment(comment);

 System.out.println("COMMENT:" + comment);

 claslist.add(c);

Struts的设置和jsp文件就不详细讲了。

5. Redis数据库

Redis数据库里面的内容(使用的是Redis Desktop Manager):

最后是运行结果:

当然,这只是实现了从Redis查询数据,还没有实现将Redis作为MySQL的缓存。

5. 添加功能的实现

新建一个Action:RClasAction,实现向Redis添加课程数据,并同步到MySQL。


package com.school.action;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

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

import com.opensymphony.xwork2.ActionSupport;

import com.school.entity.Clas;

import com.school.redisclient.RedisService;

import com.school.redisclient.RedisTool;

import com.school.service.ClasService;

@SuppressWarnings("serial")

public class RClasAction extends ActionSupport { 

 @Autowired

 private ClasService clasService; 

 RedisService rs = RedisTool.getRedisService();

 List Clas claslist = new ArrayList Clas 

 private Clas clas;

 public Clas getClas() {

 return clas;

 public void setClas(Clas Clas) {

 this.clas = Clas;

 public String execute(){

 saveClas(clas);

 return SUCCESS;

 @SuppressWarnings({ "rawtypes", "unchecked" })

 private void saveClas(Clas c){

 List String ids = rs.getList("clas:id");

 // clas:id

 int num = ids.size();

 int id = Integer.parseInt(ids.get(num-1)) + 1;

 rs.rightPushList("clas:id", String.valueOf(id));

 // clas:count

 int count = Integer.parseInt(rs.get("clas:count"));

 rs.set("clas:count", String.valueOf(count+1), -1);

 // 增加

 HashMap hashmap = new HashMap();

 hashmap.put("ID", String.valueOf(id));

 hashmap.put("NAME", clas.getName());

 hashmap.put("COMMENT", clas.getComment());

 rs.addHash("clas:" + id, hashmap);

 // 同步到MySQL

 clasService.saveClas(clas);

}

clas:id是一个List类型的Key-Value,记录了所有的课程ID,取出最后一个ID,再+1,作为增加的课程的ID,同时clas:count的值也要+1。使用addHash()方法向Redis添加了一个Hash类型的Key-Value(也就是一门课程):


 @SuppressWarnings({ "unchecked", "rawtypes" })

 public synchronized void addHash(K key, HashMap map){

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

 }

同时将该门课程增加到MySQL。

6. 删除功能的实现

新建一个Action:RClasDeleteAction,实现删除Redis的课程数据,并同步到MySQL。


package com.school.action;

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

import com.opensymphony.xwork2.ActionSupport;

import com.school.redisclient.RedisService;

import com.school.redisclient.RedisTool;

import com.school.service.ClasService;

@SuppressWarnings("serial")

public class RClasDeleteAction extends ActionSupport { 

 @Autowired

 private ClasService clasService; 

 RedisService rs = RedisTool.getRedisService() 

 private int id;

 public int getId(){

 return id;

 public void setId(int id){

 this.id=id;

 public String execute(){ 

 deleteClas(id);

 // 同步到MySQL

 clasService.deleteClas(id);

 return SUCCESS;

 private void deleteClas(int id){

 // 删除

 rs.del("clas:" + id);

 // clas:count

 int count = Integer.parseInt(rs.get("clas:count"));

 rs.set("clas:count", String.valueOf(count-1), -1);

 // clas:id

 rs.delListItem("clas:id", String.valueOf(id));

}

直接删除clas:id,再将clas:count的值-1,这两步比较简单,复杂的是从clas:id中删除该课程的ID,使用了delListItem()方法来实现:


 @Override

 public synchronized void delListItem(K key, V value){

 redisTemplate.opsForList().remove(key, 1, value);

 }

redisTemplate.opsForList().remove()方法类似于LREM命令。最后在MySQL中也删除相同的课程。

7. 修改功能的实现

新建一个Action:RClasUpdateAction,实现删除Redis的课程数据,并同步到MySQL。


package com.school.action;

import java.util.HashMap;

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

import com.opensymphony.xwork2.ActionSupport;

import com.school.entity.Clas;

import com.school.redisclient.RedisService;

import com.school.redisclient.RedisTool;

import com.school.service.ClasService;

@SuppressWarnings("serial")

public class RClasUpdateAction extends ActionSupport{ 

 @Autowired

 private ClasService clasService; 

 RedisService rs = RedisTool.getRedisService(); 

 private Clas clas;

 public Clas getClas() {

 return clas;

 public void setClas(Clas clas) {

 this.clas = clas;

 @SuppressWarnings({ "unchecked", "rawtypes" })

 public String execute(){

 HashMap hashmap = new HashMap();

 hashmap.put("ID", String.valueOf(clas.getId()));

 hashmap.put("NAME", clas.getName());

 hashmap.put("COMMENT", clas.getComment());

 rs.putHash("clas:" + clas.getId(), hashmap);

 // 同步到MySQL

 clasService.updateClas(clas);

 return SUCCESS;

使用了putHash()方法来更新:


 @SuppressWarnings({ "rawtypes", "unchecked" })

 @Override

 public synchronized void putHash(K key, HashMap map){

 redisTemplate.boundHashOps(key).putAll(map);

 }

 同时在MySQL做相同的更新操作。

本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!


我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题

本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 详解SSH框架和Redis的整合