基本介绍
redis中间件。REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis的高并发和快速主要基于下面三个原因:
- redis是基于内存的,内存的读写速度非常快;
- redis是单线程的,省去了很多上下文切换线程的时间;
- redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。
redis分布式锁
public boolean cacheValue(String key, String value, long time) {
if (value.equalsIgnoreCase(getValue(key))) {
return false;
}
key = String.format("%s%s", KEY_PREFIX_VALUE, key);
try {
ValueOperations<String, String> valueOps = redisTemplate.opsForValue();
boolean status = valueOps.setIfAbsent(key, value);
if (!status) {
return false;
}
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Throwable t) {
return false;
}
}
redis自增
public Long incr(String key, long liveTime) {
key = String.format("%s%s", KEY_PREFIX_VALUE, key);
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if (increment == 0 && liveTime > 0) {
entityIdCounter.expire(liveTime, TimeUnit.MINUTES);
}
return increment;
}