redis 在spring中的使用

[toc]

安装redis

使用docker安装

redis的镜像启动时是没有redis.conf文件的 如果要进行修改配置只能下载源码然后把配置文件添加进去
修改配置文件 #bind 127.0.0.1 protected-mode no

  1. docker pull redis
  2. 传你的配置文件然后docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf
  3. 使用登录命令redis-cli -h ip地址 -p 6379 -a 密码即可登录

或者使用官方安装模式

$ wget http://download.redis.io/releases/redis-4.0.6.tar.gz
$ tar xzf redis-4.0.6.tar.gz
$ cd redis-4.0.6
$ make
运行
src/redis-server redis.conf

或者windows的版本
下载Windows版本Redis我们直接访问github网址:github.com/MSOpenTech/redis/releases,下载最新的windows X64版本的msi包

spring redis使用

添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置及连接设置

redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    pool:
      max-active: 8
      max-wait: -1
      max-idle: 8
      min-idle: 0
    timeout: 0

使用:

@Service
public class RedisService {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    RedisConnectionFactory redisConnectionFactory;

    /*@Autowired
    RedisTemplate<String,User> redisTemplate;*/

    public Object setValue(String s){
        stringRedisTemplate.opsForValue().set("jia1",s);
        return stringRedisTemplate.opsForValue().get("jia1");
    }

redis 命令操作

先说一下redis的队列

基本操作:
1. lpush key value: 向队列中添加数据, lpush queue jia;
2. lpop key : 出队列, 如果没有返回空,lpop queue ,
3. blpop key 0: 阻塞查询,如果队列为空就阻塞,blpop queue 0,

优先队列

BLPOP命令可以同时接收多个键BLPOP key [key …] timeout,当所有键(列表类型)都为空时,则阻塞,当其中一个有元素则会从该键返回。==如果多个键都有元素则按照从左到右的顺序取第一个键中的一个元素,因此可以借此特性实现优先级队列
意思就是说 向多个队列添加数据,然后使用blpop 监听多个,从左到右的顺序为优先队列
blpop queue1 queue2 queue3 0 如果这三个对列有值,就按照从左到右的优先级push

订阅发布

发布/订阅”(publish/subscribe):订阅者可以订阅一个或多个频道(channel),而发布者可以向指定的频道发送消息,所有订阅次频道的订阅者都会收到次消息

  • PUBLISH :将信息 message 发送到指定的频道 channel。返回收到消息的客户端数量。
  • SUBSCRIBE :订阅给指定频道的信息。一旦客户端进入订阅状态,客户端就只可接受订阅相关的命令SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE和PUNSUBSCRIBE除了这些命令,其他命令一律失效。
  • UNSUBSCRIBE :取消订阅指定的频道,如果不指定,则取消订阅所有的频道
publish chann1 jiajunlong

subscribe chann1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chann1"
3) (integer) 1
1) "message"
2) "chann1"
3) "jiajunlong"

RedisTemplate

Redis模块的核心类,因为它的功能丰富。模板为Redis交互提供了高级抽象。虽然RedisConnection提供接受和返回二进制值(字节数组)的低级方法,但该模板可以处理序列化和连接管理,使得用户不需要处理太多的细节

基本的数据类型的操作

字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)

// string 类型的
 ValueOperations<String, String> stringOperations = redisTemplate.opsForValue();
  stringOperations.set("string1", "fiala");// string 类型保存

  //其他的也是如此 使用 例如
  ListOperations<string , Object> listoperation=redisTemplate.opsForList();

队列

发布与订阅

//发布消息 和命令差不多
redisTemplate.convertAndSend(channel, message);
@Component
public class MessageListen implements MessageListener {
    @Autowired
    RedisTemplate redisTemplate;

    @Override
    public void onMessage(Message message, byte[] bytes) {
        byte[] body = message.getBody();// 请使用valueSerializer
        byte[] channel = message.getChannel();
        // 序列化回来
        String msgContent = (String) redisTemplate.getValueSerializer().deserialize(body);
        String topic = (String) redisTemplate.getStringSerializer().deserialize(channel);
        System.out.println(msgContent+""+topic);
    }
}
// 在xml 中进行channel 的监听配置

// 在java 中配置
@Bean
    public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory,MessageListener messageListener){
        RedisMessageListenerContainer redisMessageListenerContainer=new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        redisMessageListenerContainer.addMessageListener(messageListener, new ChannelTopic("chane"));
        return redisMessageListenerContainer;
    }

    @Bean
    MessageListener messageListener(){
        return new MessageListener() {
            @Override
            public void onMessage(Message message, byte[] bytes) {
                System.out.println("wod cas");
            }
        };
    }

参考:http://www.cnblogs.com/luochengqiuse/p/4640932.html
参考: http://blog.csdn.net/forezp/article/details/71023652


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注