非关系数据库redis
什么是redis
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
1 redis语法
通用命令: key-val
设置过期时间: setex key (seconds) (value)
删除: del key
如:set user zy; //key–>user , val --> zy.
setex user 10 zy //设置key为user 值为zy ,10秒后过期
- String 类型
set key val //添加
get key //获取
del key //删除
注意:可以存储二进制,需要把key 和val 转换为byte[];
- hash 类型
Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
hset key filed val //添加
hmset key filed1 val1 [filed2] [val2] //批量添加
hget key filed //获取一个字段的值
hmget key filed [filed2] //获取多个字段的值
hgetall key //获取所有字段的值
hdel key filed [filed2] //删除1个或多个字段
- List(注意不是集合而是相当于JAVA中的队列)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
rpush key value1 [value2] //右边添加多个值
lpush key value1 [value2] //左边添加多个值
rpop key //右边取一个
lpop key //左边取一个
llen key //获取链表长度
br[l]pop key timeout //设置阻塞设计 单位为:秒
- Set(集合)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
sadd key member1 [member2] //添加一个或多个成员
srem key member1 [member2] //移除一个或多个成员
scard key //获取集合成员数
sdiff key ke1 //返回两个集合的差集
sinter key key1 //返回两个集合的交集
smembers key //返回集合的所有成员
- sorted set(有序集合)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。
zadd key score1 member1 [score2 member2] //添加一个或多个成员
zcard key //获取成员数
zcount key min max // 计算在有序集合中指定区间分数的成员数
zincrby key increment member //有序集合中对指定成员的分数加上增量 incremen
zrem key member [member ...] //移除有序集合中的一个或多个成员
zrank key member //返回有序集合中指定成员的索引
zrange key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从低到高
zrangebyscore key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从低到高排序
zrevrange key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
zrevrangebyscore key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
- Redis 发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道
publish channel message 将信息发送到指定的频道。
punsubscribe [pattern [pattern ...]] 退订所有给定模式的频道。
subSCRIBE channel [channel ...] 订阅给定的一个或多个频道的信息。
unsubscribe [channel [channel ...]] 指退订给定的频道。
2 Redis运用场景
- 显示最新的项目列表
- 删除与过滤
- 排行榜相关
- 按照用户投票和时间排序
- 过期项目处理
- 计数
- 特定时间内的特定项目
- 实时分析正在发生的情况,用于数据统计与防止垃圾邮件等
- Pub/Sub
- 队列
- 缓存
3 springboot整合redis
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 排除lettuce包,使用jedis代替-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
yaml配置
#服务器的端口号
server:
port: 8080
spring:
redis:
host: 127.0.0.1 #redis的ip
port: 6666 #redis端口号
配置类
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
之后就可使使用
RedisTemplate 来操作redis了
例如
@Autowired //注入(写在需要注入的类中)
private RedisTemplate<String, Object> redisTemplate;
//使用redisTemplate向list类型中放入一个值(写在方法内)
redisTemplate.opsForList().rightPushAll(key, value);
当然通过上面的这种方式可以封装出一个工具类,这里我就不列举了(因为太多(`へ´*)ノ)