redis在实际场景中的应用

本文链接:https://blog.csdn.net/m0_37499059/article/details/79964717
想起自己以前想把Redis整合到JavaWeb项目中,网上搜了很多教程都不全面,现在我终于弄明白了,所以想在这分享一下。

1.Redis的安装

我这里就不讲了,网上有很多教程,windows,Linux,我自己的是搭建在服务器上的。
图形化连接

向业务逻辑中添加缓存

1.1. 接口封装
常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。

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 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 hvals(String key) {
Jedis jedis = jedisPool.getResource();
List 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 hvals(String key) {
return jedisCluster.hvals(key);
}
@Override
public Long del(String key) {
return jedisCluster.del(key);
}
}
配置:applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 连接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> -->
封装代码测试 @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 getContentListByCid(long cid) {
//查询缓存
try {
//如果缓存中有直接响应结果
String json = jedisClient.hget(CONTENT_LIST, cid + “”);
if (StringUtils.isNotBlank(json)) {
List 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 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 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;
}

Redis具有多种实际应用场景,包括但不限于以下几个方面: 1. 缓存:Redis最常见的用途就是作为缓存层,将经常访问的数据存储在内存,以提高读取速度和减轻后端数据库的负载。通过使用Redis的高速读写能力,可以大幅提升系统的响应性能。 2. 会话存储:Redis可以用作会话存储,将用户的会话数据存储在内存,实现快速的会话访问和管理。这对于需要处理大量并发用户请求的应用程序特别有用。 3. 消息队列:Redis支持发布-订阅模式(Pub/Sub),可以作为消息队列系统使用。通过将消息发布到特定的频道,不同的客户端可以订阅这些频道并接收实时的消息推送。这在实时通知、实时聊天和异步任务处理等场景非常有用。 4. 计数器和排行榜:Redis提供了原子性操作和快速的计数功能,可用于实现计数器和排行榜功能。例如,在社交媒体应用,可以使用Redis来实时统计用户的粉丝数量或文章的点赞数,并根据这些数据生成排行榜。 5. 地理位置服务:Redis的地理位置功能(Geo)可以存储和查询地理位置信息,如坐标和半径范围内的位置。这使得Redis在构建地理位置服务(如附近的人、门店定位等)时非常有用。 总之,Redis是一个功能强大且灵活的内存数据库,可用于多种实际应用场景,包括缓存、会话存储、消息队列、计数器和排行榜,以及地理位置服务等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值