1 Redis
1.1 NoSQL
- NoSQL( not only sql) 泛指非关系型数据库
- 适用于处理处理超大规模的数据,和高并发的访问
- redis和memcached是key-value的Nosql,主要用来做缓存的.
1.2 什么是Redis
1.Redis 是一个高性能的 开源的、C语言写的Nosql(非关系型数据库),数据保存可以存储在内存中或者磁盘中。
2. Redis 以key-value形式来储存,是一种数据结构化存储方法的集合。–数组 list set map
1.3 Redis的特点及优势
- 因为它对数据的保存主要是在内存中,读取性能高,并发性强。
- 支持的value形式较多,如:String,List,Set,zset(sorted set --有序集合)和hash(哈希类型)。
- redis有java.c++等 客户端,使用方便
- 支持集群
- 支持持久化,可以将数据转存到磁盘【只需要作少量的配置】
- 支持订阅,发布(subscribe/publish)等功能
1.4 MySQl Memcached和Redis的比较
Memcached和Redis的比较
相同点:都是key-value NoSQl,都是存储数据在内存中,读写速度快,都支持存储过期【用于道具,优惠券。。】
不同点: 1. Redis支持持久化
2. Redis支持的存储类型更多
1.5 Redis的安装
https://github.com/microsoftarchive/redis/releases
- 解压后直接使用
1.6 使用redis-cli客户端常用命令
1.6.1 对value为String类型的操作
- set key value //set name zhangsan 将支付串 zhangsan关联到name
- get key 返回key关联的字符串值
- mset mget 同时设置或获取多个值
- incr key //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
- decr key //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
- incrBy key number//自增**
- decrBy key number //减少
1.6.2 对key的操作
- keys * 获取所有key的列表
- del key 删除key
- expire key xx 设置key的过期时间(xx秒后过期)
- ttl key 查看key的过期时间
- flushall 清空Redis服务器的所有数据,包括每个库
- flushdb 清空Redis当前库的数据,Redis有16个库【index 0-15】
1.6.3 对list集合的常用操作
- lpush key value 将一个或多个值 value 插入到列表 key 的表头(最左边)
- rpush key value 将一个或多个值 value 插入到列表 key 的表尾(最右边)
- lpop 移除并返回列表 key 的头(最左边)元素。
- rpop 移除并返回列表 key 的头(最右边)元素
- lrange key 0 -1 查询key中所有的元素
- lrem key count value 根据count值移除列表key中与参数 value 相等的元素count > 0
1.6.4 对set集合的常用操作
- sadd key member 将一个或多个 member 元素加入到集合 key 当中,重复的只留下一个
- srem key member 移除集合 key 中的一个或多个 member 元素
- smembers key 返回集合 key 中的所有成员
1.6.5 对hash类型的常用操作
- hset key name value 添加一个name=>value键值对到key这个hash类型
- hget key name 获取hash类型的name键对应的值
- hmset key name1 key1 name2 key2 批量添加
- hmget key name1 name2 批量获取值
- hkeys 返回哈希表 key 中的所有键
- hvals 返回哈希表 key 中的所有值
- hgetall 返回哈希表 key 中,所有的键和值
1.6.6 Redis 事务
- multi 标记一个事务块的开始。
- exec 执行所有事务块内的命令
- discard //取消事务,放弃执行事务块内的所有命令。
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作,一个操作的失败不会影响到其他操作,这一点与java不同
1.6.7 订阅,发布
- SUBSCRIBE channel [channel …] 订阅给定的一个或多个频道的信息。
- PUBLISH channel message 将信息 message 发送到指定的频道 channel
1.6.7 设置密码命令
- CONFIG SET requirepass 123456 将密码设置为123456
- CONFIG SET requirepass “‘ 将密码设置为空
- AUTH 123456 输入密码进行认证
上面的设置会在重启服务器后失效
1.7 使用java操作Redis
1.7.1 导入需要的jar包
1.7.2 简单的操作
// 1. 常规使用jedis
@Test
public void testRedis(){
//ip 号
String host ="127.0.0.1";
//端口号
int port = 6379;
//超时时间 ms
int timeout = 1000;
//获取Jdeis 对象
Jedis jedis = new Jedis(host, port, timeout);
jedis.auth("123456");
jedis.set("name", "twodog");
System.out.println(jedis.get("name"));
jedis.close();
};
1.7.3 使用Jedis 连接池
// 思路分析
//1 创建jedispool配置对象
//2 做配置-四个
//3 创建jedispool
//4 通过jedispool获取连接
//5 执行操作
// 6 释放连接
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
@Test
public void testPool(){
// 1.创建jedispool的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 2.做配置
config.setMaxIdle(2); //闲置连接数
config.setMaxTotal(10); //设置总链接数
config.setMaxWaitMillis(1000*1); //设置最大等待时间
config.setTestOnBorrow(true); //获取连接时测试 连接是否畅通
//3. 获取jedispool对象
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 1,"123456");
//获取连接的对象
Jedis jedis = jedisPool.getResource();
jedis.mset("name","gouzi","age","18");
System.out.println(jedis.mget("name","age"));
System.out.println("-------------------------------");
System.out.println(jedis.keys("*"));
//crud
System.out.println(jedis.set("height", "180"));
System.out.println(jedis.set("height", "200"));
System.out.println(jedis.get("height"));
System.out.println(jedis.del("height"));
System.out.println(jedis.keys("*"));
jedis.flushDB();
//关闭连接
jedis.close();
//关闭连接池
jedisPool.destroy();
};
1.7.4 操作集合
@Test
public void testList(){
// 1.创建jedispool的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 2.做配置
config.setMaxIdle(2); //闲置连接数
config.setMaxTotal(10); //设置总链接数
config.setMaxWaitMillis(1000*1); //设置最大等待时间
config.setTestOnBorrow(true); //获取连接时测试 连接是否畅通
//3. 获取jedispool对象
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 1,"123456");
//获取连接的对象
Jedis jedis = jedisPool.getResource();
//连接池操作集合
jedis.lpush("student","3","7","4","1","5","9","2");
//取值
// System.out.println(jedis.lrange("student",0 ,-1 ));
//升序排列集合
// System.out.println(jedis.sort("student"));
//降序排列
SortingParams sortingParams1 = new SortingParams();
sortingParams1.desc();
sortingParams1.alpha();
//System.out.println(jedis.sort("student", sortingParams1));
//对字母排序
jedis.lpush("language","java","c","python","test","ui");
System.out.println(jedis.sort("language", sortingParams1));
}
1.7.5 Redis 的事务
// 4.jedis的事务 没有回滚,一个操作的失败不会影响其他操作
@Test
public void testTX(){
// 1.创建jedispool的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 2.做配置
config.setMaxIdle(2); //闲置连接数
config.setMaxTotal(10); //设置总链接数
config.setMaxWaitMillis(1000*1); //设置最大等待时间
config.setTestOnBorrow(true); //获取连接时测试 连接是否畅通
//3. 获取jedispool对象
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 1,"123456");
//获取连接的对象
Jedis jedis = jedisPool.getResource();
//清空redis中的数据
jedis.flushDB();
jedis.mset("name","傻强","age","18");
System.out.println(jedis.mget("name","age"));
//开启事务
Transaction multi = jedis.multi();
//同时让name 跟age自增
multi.incr("name");
multi.incr("age");
//提交事务
List<Object> exec = multi.exec();
System.out.println(exec);
System.out.println(jedis.mget("name","age"));
//关闭连接
jedis.close();
//关闭连接池
jedisPool.destroy();
//结论,jedis中的事务失败,不会回滚,不会影响已经执行的操作
};
1.7.6 对Set Hash的操作
@Test
public void testCon(){
// 1.创建jedispool的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 2.做配置
config.setMaxIdle(2); //闲置连接数
config.setMaxTotal(10); //设置总链接数
config.setMaxWaitMillis(1000*1); //设置最大等待时间
config.setTestOnBorrow(true); //获取连接时测试 连接是否畅通
//3. 获取jedispool对象
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 1,"123456");
//获取连接的对象
Jedis jedis = jedisPool.getResource();
//清空redis中的数据
jedis.flushDB();
//给Hash添加数据
Map<String, String> map = (Map<String, String>) new HashMap();
map.put("usa","iroman" );
map.put("jpa", "奥特曼");
map.put("chn", "燕双鹰");
jedis.hmset("hero",map);
//给set添加数据
jedis.sadd("set","德邦","赵信","盖伦","蛮王","德邦");
System.out.println(jedis.smembers("set")); //set取值结果无序不重复
System.out.println(jedis.hmget("hero","usa","jpa","chn"));
};
1.8 Redis的持久化配置
1.8.1 RDB模式
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
如何关闭 rdb 模式:
``
save ""
# save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
# save xxx
# save 60 10000
save 1 1 //在1秒内有1次改变就同步一次
``
1.8.2 AOF追加模式
如何开启aof模式:
appendonly yes //yes 开启,no 关闭
# appendfsync always //每次有新命令时就执行一次fsync
#这里我们启用 everysec
appendfsync everysec //每秒 fsync 一次
# appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)