redis
1.概念
redis是一款高性能的NOSQL系列的非关系型,高缓存型数据库。
关系型数据库与非关系型数据库(NOSQL)
1.1 NOSQL与关系型数据库比较
- 优点
- 成本:nosql数据库简单易部署,基本都是开源软件。关系型数据库一般为收费。
- 查询速度:nosql数据库将数据存储与缓存之中,关系型数据库储存在硬盘中,nosql读取速度更快
- 储存格式:nosql的储存格式为key、value形式,value形式多样:文档形式、图片形式等。而关系型数据库则只支持基础类型。
- 扩展性:关系型数据库有类似join这样的多表查询机制的,导致后期扩展困难
- 缺点
- 维护工具和资料有限。
- 不提供对sql的支持。即数据库之间没有统一的标准命令。学习成本高,每一个nosql数据库之间没有任何联系。
- 不提供关系型数据库对事务的处理。
- 总结:关系型数据库与nosql数据库并非对立而是互补的关系,一般会将数据储存在关系型数据库中,在nosql数据库中去备份关系型数据库中的数据。利用两者互补的关系,从而提高数据的访问速度。
1.2 Redis储存键值数据类型:
- 字符串类型【String】:
- 哈希类型【hash】:
- 列表类型【list】:
- 集合类型【set】:
- 有序集合类型【sortedset】:
1.3 redis的应用场景
- 缓存(数据查询、新闻内容)
- 聊天室的在线好友列表
- 任务队列(抢购、秒杀)
- 应用排行榜
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
1.4 注意:
-
Key支持自动过期被删除
-
下载安装
-
官网:https://redis.io/
-
中文网:https://www.redis.net.cn/
-
绿色版【解压直接可以使用】:
- redis.windows.conf:核心配置文件
- redis-cli.exe:redis的客户端
- redis-server.exe:redis的服务器端
2. 命令操作
2.1 redis数据结构
-
redis储存的是:key,value格式的数据。其中key都是字符串,value有5中不同的数据结构。
- 字符串类型【String】:
- 哈希类型【hash】:map格式
- 列表类型【list】 :linkedlist --> 元素可以重复
- 集合类型【set】 :hashset --> 元素不可以重复
- 有序集合类型【sortedset】: --> 元素不可以重复,且输入存入之后会自动排序
2.2 命令操作
- 字符串类型【String】:
- 存储:
- set key value:存储数据
- setex key seconds value:存储数据,seconds秒后自动删除
- 获取:get key
- 删除:del key
- 存储:
- 哈希类型【hash】:数据不可重复,会覆盖
- 存储:hset key filed value
- 获取单条:hget key filed【获取指定的filed对应的值】
- 获取全部:hgetall key【获取所有的filed和value】
- 删除:hdel key filed
- 列表类型【list】:数据可重复,
可以添加一个元素到列表的头部(左边)或者尾部(右边)。
【可以当作队列来使用】- 添加
- lpush key value:将元素插入到列表最左边
- rpush key vaule:将元素插入到列表最右边
- 获取:
- lrange key start end:范围获取
- lrange myList 0 -1 【查询所有】
- 列表下标从0开始
- 删除:
- lpop key:删除列表中最左边的元素,并将元素返回
- rpop key:删除列表中最右边的元素,并将元素返回
- 添加
- 集合类型 set:不允许重复元素
- 存储:sadd key value
- 获取:smembers key:可以获取set集合中的所有元素
- 删除:srem key value:可以删除set集合中的某个元素
- 有序集合类型 sortedset:不允许重复元素,且按照指定的score从小到大排序
- 存储:zadd key score value
- 存如数据时:score可以单独覆盖,其他数据不变
- 获取:zrange key start value 【withscores】
- 删除:zrem key value
- 存储:zadd key score value
- 通用命令
- key *:查询所有键
- type key :查询该键对应的value的类型
- del key:删除指定key value
2.3 持久化操作
-
redis 是一个内存数据库,当服务器断电再连接时,有可能会丢失数据,所以我们选择持久化数据到硬盘中
-
redis持久化机制:
-
RDB:默认方式,不需要进行配置,但在打开服务器时,加载指定配置文件【redis.windows.conf】。
在一定间隔时间内,检测key值的变化情况,然后持久化数据,
-
编辑redis所在窗口中的 【redis.windows.conf】文件
下面三种情况满足其中一中将进行持久化任务-
after 900 sec (15 min) if at least 1 key changed
15分钟后,超过一条key值改变save 900 1
-
after 300 sec (5 min) if at least 10 keys changed
5分钟后,超过10条key值改变save 300 10
-
after 60 sec if at least 10000 keys changed
1分钟后,超过10000条key值改变save 60 10000
-
-
先在redis所在窗口中打开dos窗口
-
再通过该命令【 redis-server.exe redis.windows.conf 】加载配置文件
-
-
AOF:日志记录的方式,可以记录每一条命令的操作。可以在每一次命令操作后,持久化数据,
会将数据持久化到【appendonly.aof】文件中- 通过编辑【redis.windows.conf】文件中的【appendonly】属性值来打开或关闭AOF
- appendonly no:关闭AOF
- appendonly yes:打开AOF
- 设置【appendfsync】属性来决定持久化的条件
- appendfsync always:每一次操作都进行持久化任务
- appendfsync everysec:每过一秒进行依次持久化任务
- appendfsync no:不进行持久化任务
- 通过编辑【redis.windows.conf】文件中的【appendonly】属性值来打开或关闭AOF
-
3. 通过Java代码操作redis
3.1Java代码操作redis
- 使用Java代码连接数据库时,要保证服务器的打开状态,不然连接超时
-
导入相关jar包
-
commons-pool2-2.3.jar
-
jedis-2.7.0.jar
-
创建连接
- Jedis jedis = new Jedis();空参。默认连接为本地数据库,端口号默认为:6379
- Jedis jedis = new Jedis(“localhost”, 6379);
- localhost:连接的ip地址
- 6379:连接的端口号
-
执行任务
jedis.set("username","zhangsan"); String username = jedis.get("username"); System.out.println(username);
-
释放资源:jedis.close();
3.2 jedis连接池:jedisPool
jedisPool已经在jedis中内置了,不需要使用其他第三方
-
使用
- 创建JedisPool连接池对象
- 调用方法 getResource()方法,获取jedis连接
-
连接池配置
-
获取连接池配置:JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
-
设置连接池其属性:
- 设置最大连接: jedisPoolConfig.setMaxTotal(50);
- 设置最大空闲连接: jedisPoolConfig.setMaxIdle(10);
-
连接池其他属性:
#最大活动对象数 redis.pool.maxTotal=1000 #最大能够保持idel状态的对象数 redis.pool.maxIdle=100 #最小能够保持idel状态的对象数 redis.pool.minIdle=50 #当池内没有返回对象时,最大等待时间 redis.pool.maxWaitMillis=10000 #当调用borrow Object方法时,是否进行有效性检查 redis.pool.testOnBorrow=true #当调用return Object方法时,是否进行有效性检查 redis.pool.testOnReturn=true #“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1. redis.pool.timeBetweenEvictionRunsMillis=30000 #向调用者输出“链接”对象时,是否检测它的空闲超时; redis.pool.testWhileIdle=true # 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3. redis.pool.numTestsPerEvictionRun=50 #redis服务器的IP redis.ip=xxxxxx #redis服务器的Port redis1.port=6379
-
3.3 Jedis工具类提取
public class JedisPoolUtils {
private static JedisPool jedisPool;
static {
//使用类加载器获取配置文件的is流
InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
//创建读取配置文件的 Properties
Properties pro = new Properties();
try {
//把is流绑定到Properties上
pro.load(is);
} catch (IOException e) {
e.printStackTrace();
}
//新建jedisPool配置对象
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//根据Properties中读取的信息,设置配置对象
jedisPoolConfig.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
jedisPoolConfig.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
jedisPool = new JedisPool(jedisPoolConfig, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}