1.Redis介绍
(1)Redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面
(2)Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构包括 list set map string等。
1.1 nosql的概念
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库。随着互联网2003年之后web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的交友类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
1.2 Redis优势
(1) 数据存储:存放在内存,还支持持久化.-存取速度快,并发能力强,数据安全性高
(2) 支持value类型
(3) 支持多个语言客户端
(4) 还支持集群(支持高并发,海量数据)
1.3 redis和memcache的区别
mysql | redis | memcached | |
---|---|---|---|
类型 | 关系型 | 非关系型 | 非关系型 |
存储位置 | 磁盘 | 磁盘和内存 | 内存 |
存储过期 | 不支持 | 支持 | 支持 |
读写性能 | 低 | 非常高 | 非常高 |
存储的结构 | 表来存储 | 支持很多 list/set/array/string/map等 | 普通键值对key-value |
1.4 redis的使用场景
(1) 最多就是缓存
(2)计数器应用 – 微博 热点新闻 – 转载 点赞(高并发)
(3)实时防攻击系统 – 银行网站 (登录) --计数 (ip 同一个ip + 5)
redis–支持断电恢复 内存和磁盘
(4)有效期的应用 – 道具 红包 优惠券 …
(5)支持无序的场景 – set特效
(6)队列 -->quene -->秒杀 抢购
(7)消息系统订阅发布
2.使用redis
Redis 的官方下载站是 连接,可以去上面下载最新的安装程序下来连接
2.1 对字符串操作
set key value //将字符串值value关联到key
get key //返回key关联的字符串值
mset //同时设置一个或多个 key-value 对
mget //返回所有(一个或多个)给定 key 的值
incr key //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
decr key //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
incrBy key //自增多少
decrBy key
2.2 对key的操作
keys * //获取所有key列表
del key //删除key
expire key xx //设置key的过期时间(xx秒后过期)
ttl key //查看key的过期时间
flushall //清空整个redis服务器数据,所有的数据库全部清空
flushdb //清除当前库,redis中默认有16个数据库
select index --select 0
2.3 对list操作
list集合可以看成是一个左右排列的队列(列表)
lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)
rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边)
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
lrange key start stop //对集合进行修剪
lrem key count value //根据count值移除列表key中与参数 value 相等的元素count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex key index //返回列表 key 中,下标为 index 的元素
ltrim key start stop //对一个列表进行修剪
2.4 set操作
sadd key members 添加值
srem key member 删除值
smembers key 查看可以对应的值
2.5 hash操作
hset key name value --设置key value
hget key name --通过key获取值
hmset key name1 key1 name2 key2 --批量设置
hmget key name1 name2 --批量获取
hkeys --获取所有的key
hvals --获取所有的value
hgetall --获取所有的key和value
2.6 事务操作
弱事务 : 日志
强事务 :同时成功 同时失败-- 金融数据
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作
multi //标记一个事务块的开始。
exec //执行所有事务块内的命令。
discard //取消事务,放弃执行事务块内的所有命令。
2.7 订阅发布
SUBSCRIBE channel [channel ...] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。
2.8 设置密码
- 通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass "" //清除密码
AUTH 123456 //输入密码进行认证
- 通过配置文件设置密码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码
3.通过java操作redis
原来mysql需要使用jdbc,现在需要redis的一个java客户端jedis。
jedis是客户端,而reids是服务器。使用jedis这个java客户端操作redis数据库。
3.1 使用jedis 客户端,完成jedis简单操作
@Test
public void test()throws Exception{
//创建连接
String host ="127.0.0.1";
int port = 6379;
int timeout = 1000;//超时时间,1秒超时
Jedis jedis = new Jedis(host,port,timeout);
jedis.auth("admin");
//执行操作
jedis.set("yhptest","yhptest dbl!");
System.out.println(jedis.get("yhptest"));
//关闭连接
jedis.close();
}
3.2 通过jedis连接池,简单操作redis数据库
@Test
public void test()throws Exception{
//1 创建jedispool配置对象
JedisPoolConfig config = new JedisPoolConfig();
//2 做配置-四个
config.setMaxIdle(2);
config.setMaxTotal(10);
config.setMaxWaitMillis(1*1000); //创建连接超时
config.setTestOnBorrow(true);//获取连接是测试连接是否畅通
//3 创建jedispool
//1*1000 获取连接超时时间
JedisPool pool = new JedisPool(config,
"127.0.0.1",6379,1*1000,"admin");
//4 通过jedispool获取连接
Jedis jedis = pool.getResource();
//5 执行操作
jedis.set("jedispooltest","dbldblddzt.....");
System.out.println(jedis.get("jedispooltest"));
// 6 释放连接
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
pool.destroy();
}
3.3 对字符串操作
jedis.set("name", "张三"); //set
System.out.println(jedis.get("name")); //get 获取
System.out.println(jedis.keys("*")); //查看所有key
System.out.println(jedis.del("name")); //删除key
System.out.println(jedis.get("name")); //get //获取
System.out.println(jedis.set("name", "李四")); //修改
System.out.println(jedis.get("name")); //get
3.4 对集合操作List – 有顺序 可以重复
jedis.flushDB();//清空数据库
jedis.lpush("students", "蔡徐坤", "吴亦凡", "吴亦凡", "鹿晗", "范丞丞");
jedis.lrem("students", 0, "吴亦凡");
System.out.println(jedis.lrange("students", 0, -1));
3.5 Set操作 --无顺序 不重复
jedis.flushDB();
jedis.sadd("students", "蔡徐坤", "吴亦凡", "吴亦凡", "鹿晗", "范丞丞");
System.out.println(jedis.smembers("students"));
3.6 hash操作
jedis.hset("students3","student","zhangsan");
System.out.println(jedis.hget("students3", "student"));
3.7 Jedis排序
//对数字排序
jedis.flushDB();
jedis.lpush("nums","1","2","3","4","8","5","3","1");
System.out.println(jedis.sort("nums"));
SortingParams sortingParams1 = new SortingParams();
sortingParams1.desc();
System.out.println(jedis.sort("nums", sortingParams1));
//对字母排序
jedis.lpush("langues","java","php","c++","test","ui");
SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
sortingParams.desc();
System.out.println(jedis.sort("langues",sortingParams));
3.8 事务 --弱事务
@Test
public void testTransaction() throws Exception{
JedisPoolConfig config = new JedisPoolConfig();
//闲时最大连接数
config.setMaxIdle(2);
//最大连接数
config.setMaxTotal(10);
//最大等待时间
config.setMaxWaitMillis(1000);
JedisPool jedisPool = new JedisPool(config,"127.0.0.1", 6379, 1000*10,"123456");
Jedis jedis = jedisPool.getResource();
jedis.set("name","蔡徐坤");
jedis.set("age","30");
//开启事务
Transaction transaction = jedis.multi();
transaction.incr("name");
transaction.incr("age");
List<Object> list = transaction.exec();
System.out.println(list);
jedis.close();
jedisPool.destroy();
}
4.redis 持久化
有时候 我们的服务一旦关了,数据就会丢失,但是有时候 我们需要把数据存下来,所有在做持久化操作;持久(持久层 dao层 mapper层): 就把数据保存到磁盘 这个过程就叫持久化
4.1 rdb方式
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,默认开启该模式。
如何关闭 rdb 模式:
save ""
# save 900 1 //至少在900秒的时间段内至少有一次改变存储同步一次
# save 120 10 //在120秒内有10个数数据发生了变化就会储存
# save 1 10000 //在1秒内有10000个数据发生变化就储存一次
4.2 aof方式
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,默认关闭该模式。
如何开启aof模式:
appendonly yes //yes 开启,no 关闭
# appendfsync always //每次有新命令时就执行一次fsync
#这里我们启用 everysec
appendfsync everysec //每秒 fsync 一次
# appendfsync no //从不fsync(交给操作系统来处理,可能很久才执行一次fsync)
5 redis的淘汰策略
淘汰一些数据,达到redis数据都是有效的。选择合适的淘汰策略进行淘汰。
5.1 lru:最近最少使用
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
5.2 ttl:将要过期中淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
5.3 random: 随机数据
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
5.4 其他淘汰策略
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
redis 确定驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。