Spring Data Redis

来源:互联网 发布:淘宝从零做到年销千万 编辑:程序博客网 时间:2024/05/06 13:55

1.安装

apt-get install redis-server

安装完成后会自动启动(默认监听6379端口)

修改配置

vi /etc/redis/redis.conf#取消注释requirepassrequirepass 你的密码#注释bind(ip绑定)#bind 127.0.0.1

redis的restart start stop status

/etc/init.d/redis-server restart

2.数据操作RedisTemplate

@Autowired    private RedisTemplate<String, String> redisTemplate;    @Override    public Long del(final String... keys) {        return redisTemplate.execute(new RedisCallback<Long>() {            public Long doInRedis(RedisConnection connection) throws DataAccessException {                long result = 0;                for (int i = 0; i < keys.length; i++) {                    result = connection.del(keys[i].getBytes());                }                return result;            }        });    }    @Override    public void set(final byte[] key, final byte[] value, final long liveTime) {        redisTemplate.execute(new RedisCallback<Long>() {            public Long doInRedis(RedisConnection connection) throws DataAccessException {                connection.set(key, value);                if (liveTime > 0) {                    connection.expire(key, liveTime);                }                return 1L;            }        });    }    @Override    public void set(String key, String value, long liveTime) {        this.set(key.getBytes(), value.getBytes(), liveTime);    }    @Override    public void set(String key, String value) {        this.set(key, value, 0L);    }    @Override    public void setObject(String key, Object value) {        this.set(key.getBytes(), CommonUtils.serialize(value), 0L);    }    @Override    public void setObject(String key, Object value, long liveTime) {        this.set(key.getBytes(), CommonUtils.serialize(value), liveTime);    }    @Override    public void set(byte[] key, byte[] value) {        this.set(key, value, 0L);    }    @Override    public <T> T getObject(final String key,Class<T> clazz) {        return CommonUtils.deserialize(this.get(key.getBytes()),clazz);    }    @Override    public String get(final String key) {        return redisTemplate.execute(new RedisCallback<String>() {            public String doInRedis(RedisConnection connection) throws DataAccessException {                try {                    byte[] b = connection.get(key.getBytes());                    if(b != null && b.length > 0){                        return new String(connection.get(key.getBytes()), Constant.UTF_8);                    }                } catch (UnsupportedEncodingException e) {                    e.printStackTrace();                }                return "";            }        });    }    @Override    public byte[] get(final byte[] key) {        return redisTemplate.execute(new RedisCallback<byte[]>() {            public byte[] doInRedis(RedisConnection connection) throws DataAccessException {                try {                    return connection.get(key);                } catch (Exception e) {                    e.printStackTrace();                }                return null;            }        });    }    @Override    public Set<String> getkeys(String pattern) {        return redisTemplate.keys(pattern);    }    @Override    public boolean exists(final String key) {        return redisTemplate.execute(new RedisCallback<Boolean>() {            public Boolean doInRedis(RedisConnection connection) throws DataAccessException {                return connection.exists(key.getBytes());            }        });    }    @Override    public String flushDB() {        return redisTemplate.execute(new RedisCallback<String>() {            public String doInRedis(RedisConnection connection) throws DataAccessException {                connection.flushDb();                return "ok";            }        });    }    @Override    public Long dbSize() {        return redisTemplate.execute(new RedisCallback<Long>() {            public Long doInRedis(RedisConnection connection) throws DataAccessException {                return connection.dbSize();            }        });    }    @Override    public String ping() {        return redisTemplate.execute(new RedisCallback<String>() {            public String doInRedis(RedisConnection connection) throws DataAccessException {                return connection.ping();            }        });    }    @Override    public List<Object> findByPage(final String key,Integer page,Integer pageSize){        return redisTemplate.execute(new RedisCallback<List<Object>>() {            public List<Object> doInRedis(RedisConnection connection) throws DataAccessException {                List<Object> results = new ArrayList<>();                Integer begin = (page - 1) * pageSize;                Integer end = pageSize + begin - 1;                Set<byte[]> s = connection.zRange(key.getBytes(), begin, end);//zRange 小→大 取值   zRevRange 大→小 取值                for (Iterator<byte[]> iter = s.iterator(); iter.hasNext();) {                    Object obj = CommonUtils.deserialize(iter.next(), Object.class);                    if(obj != null)                        results.add(obj);               }                return results;            }        });    }    @Override    public void setPageData(final String key,final Object data){        redisTemplate.execute(new RedisCallback<Long>() {            @SuppressWarnings("rawtypes")            public Long doInRedis(RedisConnection connection) throws DataAccessException {                if(data != null && data instanceof List){                    List $data = (List) data;                    if(data != null && !$data.isEmpty()){                        Integer size = $data.size();                        for(int i=0;i<size;i++){                            Object obj = $data.get(i);                            connection.zAdd(key.getBytes(), i, CommonUtils.serialize(obj));                        }                        return 1L;                    }                }                return -1L;            }        });    }

3.Redis作为默认的缓存管理器

spring.cache.type=redisspring.redis.host=www.wuxiaozeng.cnspring.redis.password=123456

设置cache管理器类型为redis,则Spring Boot会默认注册RedisCacheManager @EnableCaching 开启缓存注解

在方法执行之前先查看是否有缓存,有则返回,无则查询并将返回值放入缓存(map集合#params[‘articleId’])
@Cacheable(value=”test”,key=”#u.id”)
无论何时都将返回值放入缓存
@CachePut(value=”test”,key=”#u.id”)
删除缓存
@CacheEvict(value=”test”)
可以组合使用上述三种注解
@Caching

     @CachePut(value="test",key="#u.id")     public User add(User u){         System.err.println("缓存了-----"+u.getId()+"===的数据"+u.getName());         return u;     }     @CachePut(value="test",key="#params['key']")     public User add(Map<String,String> params){         System.err.println("缓存了-----"+u.getId()+"===的数据"+u.getName());         return u;     }     @Cacheable(value="test",key="#u.id")//如果之前不存在此key。。则异常     public User find(User u){         return new User("ccgx","2");     }     @CacheEvict(value="test",key="#u.id")     public void del(String id){         System.err.println("del-----"+id);     }

当add之后,使用相同的id进行find,得到的依旧是旧的User,而不是新的ccgx的User,如果del之后,再次find,则返回ccgx的User

0 0