各种NoSQL数据库都有着如下几个特性:
- 不使用关系模型
- 在集群中运行良好
- 开源
- 无模式
- 适用于21世纪互联网公司
键值数据库——Redis
键值数据库是最简单的NoSQL数据库。客户端可以根据键查询值,设置键所对应的值以及删除键值对。
在项目中引入依赖之后,在application.properties配置文件中添加redis配置信息
spring.redis.database=0
spring.redis.host= 127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.timeout=30000ms
复制代码
- 首先是一个最简单的存储,在config类中新建一个RedisTemplate,它规定了存储的key为string型,value为object型
@Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory){ RedisTemplate redisTemplate = new RedisTemplate<String,Object>(); redisTemplate.setConnectionFactory(factory); return redisTemplate; }复制代码
- 接着在Test中进行测试,可以看到控制台打印出“value”
@Test public void test() { redisTemplate.opsForValue().set("key","value"); System.out.println(redisTemplate.opsForValue().get("key")); }复制代码
- 接下来在config中配置HashOperations
@Bean public HashOperations hashOperations(RedisTemplate redisTemplate){ return redisTemplate.opsForHash(); }复制代码
- 创建一个 RedisService,将HashOperations实例化后用它来对存入数据库的哈希表进行操作
@Service public class RedisService { @Autowired RedisTemplate<String,Object> redisTemplate; @Autowired HashOperations<String,String,Object> hashOperations; public void set(String key,String hashKey,Object value){ hashOperations.put(key,hashKey,value); } public Object get(String key,String hashKey){ return hashOperations.get(key,hashKey); } public void delete(String key,String hashKey){ hashOperations.delete(key,hashKey); } public Object getAll(String key){ return hashOperations.entries(key); } }复制代码
- 创建一个Controller类来响应不同的操作,启动项目之后在浏览器中输入“localhost:8080/add”以及“localhost:8080/getAll"能看到插入成功的提示以及刚刚插入如的数据,用命令行打开客户端输入”HKEYS 1 “也能显示1 中的字段
@RequestMapping(value = "/add", method = RequestMethod.GET) @ResponseBody public void test(){ String key = "1"; user.setId(key);user.setName("A");user.setAge("22"); service.set(user.getId(),"name",user.getName()); service.set(user.getId(),"age",user.getAge()); key = "2";user.setId(key);user.setName("B");user.setAge("23"); service.set(user.getId(),"name",user.getName()); service.set(user.getId(),"age",user.getAge()); System.out.println("add success end..."); } @RequestMapping(value = "/getAll", method = RequestMethod.GET) @ResponseBody public Object getAll(){ return service.getAll("1"); }复制代码
在整个过程中因为之前默认的序列化存放之后发现是乱码且不便于客户端命令行直接查看,所以在Config里替换了默认的序列化key 和value 的对象:
redisTemplate.setConnectionFactory(factory);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());复制代码
Redis发布订阅
首先需要进行配置,在Config文件中初始化监听器,并配置适配器绑定订阅频道,创建监听到消息之后的执行方法。
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory factory,MessageListenerAdapter adapter){
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(adapter,new PatternTopic("chat"));
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver receiver){
return new MessageListenerAdapter(receiver,"receiveMessage");
}复制代码
接着创建负责接收消息的接收者,并规定它接收到消息之后所需要执行的操作。
@Component
public class RedisReceiver {
public void receiveMessage(String message) {
System.out.println("Received:<"+message+">");
}
}复制代码
最后在Main函数里,需要实例化StringRedisTemplate,让它发布消息。项目启动之后,就能在控制台看到负责接收的Receiver类打印出相应的信息了。
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(RedispsApplication.class,args);
StringRedisTemplate redisTemplate = context.getBean(StringRedisTemplate.class);
redisTemplate.convertAndSend("chat","From Redis");
System.out.println("Send Success");
}复制代码