添加redis缓存 作为用户查询的缓存

本文详细介绍如何在SSM框架下整合Redis缓存系统,包括依赖导入、Redis启动配置、自定义序列化工具Protostuff的使用、RedisDao工具类设计及测试步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ssm框架 windows系统 jdk13

1.首先导入依赖

<!-- redis客户端:Jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.7.3</version>
        </dependency>
<!--prostuff序列化依赖 -->
<dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-core</artifactId>
    <version>1.0.8</version>
</dependency>
<dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-runtime</artifactId>
    <version>1.0.8</version>
</dependency>

2.启动redis 

redis-server --service-start 在命令行输入

3.因为是针对于数据进行缓存的,所以需要在Dao层设置Redisdao工具类

public class RedisDao {
        private final JedisPool jedisPool;
        public RedisDao(String ip, int port) {
            jedisPool = new JedisPool(ip, port);
        }
        private RuntimeSchema<Product> schema = RuntimeSchema.createFrom(Product.class);
        public Product getProduct(String id) {
            // redis操作逻辑
            try {
                Jedis jedis = jedisPool.getResource();
                try {
                    String key = "product:" + id;
                    // 并没有实现自带的序列化操作
                    // 采用自定义序列化 占用内存较低,并且速度快
                    // protostuff: pojo.
                    byte[] bytes = jedis.get(key.getBytes());
                    // 缓存重获取到
                    if (bytes != null) {
                        Product product = schema.newMessage();
                        ProtostuffIOUtil.mergeFrom(bytes, product, schema);
                        // seckill被反序列化
                        return product;
                    }
                } finally {
                    jedis.close();
                }
            } catch (Exception e) {

            }
            return null;
        }

        public String putProduct(Product product) {
            try {
                Jedis jedis = jedisPool.getResource();
                try {
                    String key = "product:" + product.getId();
                    byte[] bytes = ProtostuffIOUtil.toByteArray(product, schema,
                            LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
                    // 超时缓存
                    int timeout = 60 * 60;// 1小时
                    String result = jedis.setex(key.getBytes(), timeout, bytes);
                    return result;
                } finally {
                    jedis.close();
                }
            } catch (Exception e) {
            }
            return null;
        }
}

注意:使用protostuff序列化工具时,被序列化的对象必须是pojo对象(具备setter/getter)

4.在dao层的xml文件中,手动注入RedisDao 

    <!--redisDao -->
    <bean id="redisDao" class="com.itheima.ssm.dao.cache.RedisDao">
        <constructor-arg index="0" value="localhost" />
        <constructor-arg index="1" value="6379" />
    </bean>

这里是直接注入了地址和端口,其实还可以在配置文件中编写,然后在这里导入。

由于RedisDao和MyBatis的DAO没有关系,MyBatis不会帮我们自动实现该接口,所以需要手动注入RedisDao。

由于我们在RedisDao是通过构造方法来注入ip和port两个参数的,所以需要配置,如果不配置这个标签,我们需要为ip和port提供各自的setter和getter(注入时可以没有getter)。

5.修改ProductServiceImpl 

这个主要就是根据自己项目的设计来做

6.进行测试

https://blog.csdn.net/qq_34450769/article/details/79881778

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值