>데이터 베이스 >Redis >프로젝트에서 Redis를 사용하는 방법

프로젝트에서 Redis를 사용하는 방법

步履不停
步履不停원래의
2019-06-22 14:29:374604검색

프로젝트에서 Redis를 사용하는 방법

Redis를 JavaWeb 프로젝트에 통합하고 싶었지만 인터넷에서 많은 튜토리얼을 검색했지만 포괄적이지 않다는 것을 기억했습니다. , 그래서 여기서 공유하고 싶습니다.

프로젝트에서 Redis를 사용하는 방법

1. Redis 설치

에 대해서는 이야기하지 않겠습니다. 여기 있습니다 예, 인터넷, Windows, Linux에 대한 많은 튜토리얼이 있습니다. 내 튜토리얼은 서버에 구축되어 있습니다.

그래픽 연결

프로젝트에서 Redis를 사용하는 방법

비즈니스 로직에 캐싱 추가# 🎜🎜 #

1.1. 인터페이스 캡슐화

일반적으로 사용되는 방법은 인터페이스를 추출하고 독립형 버전과 클러스터에 해당하는 두 개의 구현 클래스를 생성합니다. 버전. .

1.1.1. 인터페이스 정의

##jedisClient

package cn.e3mall.common.jedis;
import java.util.List;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
Boolean hexists(String key, String field);
List<String> hvals(String key);
Long del(String key);
}

###JedisClientPool

package cn.e3mall.common.jedis;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisClientPool implements JedisClient {
private JedisPool jedisPool;
public JedisPool getJedisPool() {
return jedisPool;
}
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
@Override
public Boolean hexists(String key, String field) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.hexists(key, field);
jedis.close();
return result;
}
@Override
public List<String> hvals(String key) {
Jedis jedis = jedisPool.getResource();
List<String> result = jedis.hvals(key);
jedis.close();
return result;
}
@Override
public Long del(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.del(key);
jedis.close();
return result;
}
}

###JedisClientCluster

package cn.e3mall.common.jedis;
import java.util.List;
import redis.clients.jedis.JedisCluster;
public class JedisClientCluster implements JedisClient {
private JedisCluster jedisCluster;
public JedisCluster getJedisCluster() {
return jedisCluster;
}
public void setJedisCluster(JedisCluster jedisCluster) {
this.jedisCluster = jedisCluster;
}
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Boolean exists(String key) {
return jedisCluster.exists(key);
}
@Override
public Long expire(String key, int seconds) {
return jedisCluster.expire(key, seconds);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String field) {
return jedisCluster.hget(key, field);
}
@Override
public Long hdel(String key, String... field) {
return jedisCluster.hdel(key, field);
}
@Override
public Boolean hexists(String key, String field) {
return jedisCluster.hexists(key, field);
}
@Override
public List<String> hvals(String key) {
return jedisCluster.hvals(key);
}
@Override
public Long del(String key) {
return jedisCluster.del(key);
}
}

Configuration: applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 连接redis单机版 -->
<bean id="jedisClientPool" class="cn.e3mall.common.jedis.JedisClientPool">
<property name="jedisPool" ref="jedisPool"></property>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="115.159.126.205"/>
<constructor-arg name="port" value="6379"/>
</bean>
<!-- 连接redis集群 -->
<!-- <bean id="jedisClientCluster" class="cn.e3mall.common.jedis.JedisClientCluster">
<property name="jedisCluster" ref="jedisCluster"/>
</bean>
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean> 
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean> 
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean> 
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean> 
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean> 
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.25.162"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean> 
</set>
</constructor-arg>
</bean> -->
</beans>

패키지 코드 테스트# 🎜🎜#

@Test
public void testJedisClient() throws Exception {
//初始化Spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");
//从容器中获得JedisClient对象
JedisClient jedisClient = applicationContext.getBean(JedisClient.class);
jedisClient.set("first", "100");
String result = jedisClient.get("first");
System.out.println(result);
}

캐시 추가

1.1.1 기능 분석

#🎜 🎜#콘텐츠 목록 조회 시 캐시를 추가해 주세요.

1. 데이터베이스를 쿼리하기 전에 캐시를 쿼리하세요.

2. 결과를 쿼리한 후 결과에 직접 응답합니다.

3. 캐시에서 데이터베이스를 쿼리할 필요가 없습니다.

4. 쿼리 결과를 캐시에 추가합니다.

5. 결과를 반환합니다.

向redis中添加缓存:
Key:cid
Value:内容列表。需要把java对象转换成json。
 
使用hash对key进行归类。
HASH_KEY:HASH
            |--KEY:VALUE
            |--KEY:VALUE
            |--KEY:VALUE
            |--KEY:VALUE

참고: 캐시를 추가해도 일반 비즈니스 로직에는 영향을 미칠 수 없습니다.

코드 구현(서비스 계층에서 구현)

@Autowired
private JedisClient jedisClient;
@Value("${CONTENT_LIST}")
private String CONTENT_LIST;
@Override
public E3Result addContent(TbContent content) {
//将内容数据插入到内容表
content.setCreated(new Date());
content.setUpdated(new Date());
//插入到数据库
contentMapper.insert(content);
//缓存同步,删除缓存中对应的数据。
jedisClient.hdel(CONTENT_LIST, content.getCategoryId().toString());
return E3Result.ok();
}
@Override
public List<TbContent> getContentListByCid(long cid) {
//查询缓存
try {
//如果缓存中有直接响应结果
String json = jedisClient.hget(CONTENT_LIST, cid + "");
if (StringUtils.isNotBlank(json)) {
List<TbContent> list = JsonUtils.jsonToList(json,TbContent.class);
System.out.println("从缓存中查出的数据");
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//如果没有查询数据库
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andCategoryIdEqualTo(cid);
//执行查询
List<TbContent> list = contentMapper.selectByExampleWithBLOBs(example);
//把结果添加到缓存
try {
System.out.println("把结果添加到缓存");
jedisClient.hset(CONTENT_LIST, cid + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
**캐시 동기화를 위한 참고사항# 🎜 🎜#

한 가지 더 얘기해보자면, 핫 캐시, 만료 시간 설정(동기화하지 않는 것도 가능)

  @Override
public TbItem getItemById(long itemId) {
//获取商品添加缓存,不影业务响逻辑,try-catch
try {
System.out.println("缓存获取商品信息");
String json = jedisClient.get(REDIS_ITEM_PRE+":"+itemId+":BASE");
if(StringUtils.isNotBlank(json)) {
TbItem tbItem = JsonUtils.jsonToPojo(json,TbItem.class);
return tbItem;
}
}catch(Exception e) {
e.printStackTrace();
}
//缓存中没有,查询数据库
//根据主键查询
//TbItem tbItem = itemMapper.selectByPrimaryKey(itemId);
TbItemExample example = new TbItemExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andIdEqualTo(itemId);
//执行查询
List<TbItem> list = itemMapper.selectByExample(example);
if (list != null && list.size() > 0) {
//结果添加到缓存
try {
System.out.println("缓存添加商品信息");
jedisClient.set(REDIS_ITEM_PRE+":"+itemId+":BASE",JsonUtils.objectToJson(list.get(0)));
//设置过期时间(1个小时)
jedisClient.expire(REDIS_ITEM_PRE+":"+itemId+":BASE",TIEM_CACHE_EXPIRE);
}catch(Exception e) {
e.printStackTrace();
}
return list.get(0);
}
return null;
}
# ㅋㅋㅋ 🎜 🎜#More Redis 관련 기술 기사를 보려면

Redis 튜토리얼

프로젝트에서 Redis를 사용하는 방법 컬럼을 방문하여 알아보세요!

프로젝트에서 Redis를 사용하는 방법

위 내용은 프로젝트에서 Redis를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.