Redis简介
Redis的数据结构致力于帮助用户解决问题,而不是像关系型数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化和客户端分片(client-side sharding)等特性,用户可以很方便的将Redis扩展成一个能够包含数百GB数据、每秒处理上百万次请求的系统。
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis不使用表,它的数据库也不会预定义或者强制要求用户对Redis存储的不同数据进行关联。Redis拥有两种不同形式的持久化方法,第一种是时间点存储,第二种是将所有修改了数据库的命令都写入一个只追加的文件里面。
Redis数据结构简介
Redis可以存储键与5种不同数据结构类型之间的映射,分别是:
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
在Linux上的安装
解压安装包后,使用make,再创建bin目录,配置环境变量、配置conf(设置后台启动)
(略,请查阅相关资料)
** /etc/redis.conf**
redis.conf配置选项如下:
- daemonize 是否以后台进程运行,默认为no
- pidfile 如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
- bind 绑定主机IP,默认值为127.0.0.1(注释)
- port 监听端口,默认为6379
- timeout 超时时间,默认为300(秒)
- loglevel 日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning
- logfile 日志记录方式,默认值为stdout
- databases 可用数据库数,默认值为16,默认数据库为0
- save 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
- save 900 1 900秒(15分钟)内至少有1个key被改变
- save 300 10 300秒(5分钟)内至少有300个key被改变
- save 60 10000 60秒内至少有10000个key被改变
- rdbcompression 存储至本地数据库时是否压缩数据,默认为yes
- dbfilename 本地数据库文件名,默认值为dump.rdb
- dir 本地数据库存放路径,默认值为 ./
- slaveof 当本机为从服务时,设置主服务的IP及端口(注释)
- masterauth 当本机为从服务时,设置主服务的连接密码(注释)
- requirepass 连接密码(注释)
- maxclients 最大客户端连接数,默认不限制(注释)
- maxmemory 设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)
- appendonly 是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
- appendfilename 更新日志文件名,默认值为appendonly.aof(注释)
- appendfsync 更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。
- vm-enabled 是否使用虚拟内存,默认值为no
- vm-swap-file 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
- vm- max-memory 只可以使用内存的最大值 如果超过了此值就使用虚拟内存了交换是使用次数少为主放在虚拟内存中去。默认值为0。
以下为后台启动:
使用Redis操作key-value数据
连接到Redis
Redis提供了四种连接工厂:
具体使用哪种,现在来说区别不大。从Spring Data Redis的角度来看,这些连接工厂在适用性上都是相同的。
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private int port;
@Value("${redis.password}")
private String password;
@Bean
public JedisConnectionFactory jedisConnectionFactory(){
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.setHostName(host);
jedisConnectionFactory.setPort(port);
jedisConnectionFactory.setPassword(password);
return jedisConnectionFactory;
}
使用RedisTemplate
Spring Data Redis以模版的形式提供了较高级的数据访问方案。实际上,它提供了两个模版:
- RedisTemplate
- StringRedisTemplate
RedisTemplate可以极大简化Redis的数据访问,持久化各种类型的key-value,而不仅仅是字节数组。但在认识到key-value通常是String类型的后,StringRedisTemplate又扩展了RedisTemplate,只关注String类型。
初始化bean,我们选择序列化器如下:
@Bean
public RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}