redis基础学习
1.NOsql
1.1 概念
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,它泛指非关系型的数据库,针对非关系型数据库的语言, 弥补关系型数据库一些缺点.主要用到大的数据量或者高并发的场景下面
1.2 关系型数据库和非关系型数据库区别
关系型数据库:表和表之间具有相应的关系 – 目的而言 – 中小型的项目 数据量不是很大的情况下。
RDBMS (关系型数据库): mysql(开源免费),oracle(有钱),SQLserver,postgrep db2 ,access…等
非关系型数据库:大数据和高并发的情况使用的数据库。
2.NOsql分类
key-value(键值对): redis
column store: hbase
文档型数据库: MongoDb
图形的数据库: Neo4J, InfoGrid, Infinite Graph --推荐系统
fastdfs – 存储图片的数据库(小型的分布式文件夹)
3.NOsql中的redis非关系型数据库
3.1 什么是redis
(1)Redis 是一个高性能的 开源的、C语言写的Nosql(非关系型数据库),数据保存可以存储在内存中或者磁盘中。
(2)Redis 是以key-value形式存储,和传统的关系型数据库不一样。不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。–数组 list set map …
数据结构:数组,list,set,map等
redis提供了一下操作方法,我们使用这些方法就可以对存入字符串,组织成各种类型数据库结构(string,list,set,map等).
小结:
(1)redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面
(2)Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构
包括 list set map string等
3.2 优点
(1) 数据保存在内存,存取速度快,并发能力强
(2) 它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
(3) redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库(如MySQL)起到很好的补充作用。
(4) 它提供了Java,C/C++,C#,PHP,JavaScript等客户端,使用很方便。
(5) Redis支持集群(主从同步)。数据可以主服务器向任意数量从的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。
(6) 支持持久化,可以将数据保存在硬盘的文件中
(7) 支持订阅/发布(subscribe/publish)功能 QQ群
3.3 redis使用场景
(1) 数据保存在内存,存取速度快,并发能力强,就是缓存—>使用最多 --redis
(2)计数器应用 – 微博 热点新闻 – 转载 点赞(高并发)
(3)实时防攻击系统 – 银行网站 (登录) --计数 (ip 同一个ip + 5)
redis–支持断电恢复 内存和磁盘
(4)有效期的应用 – 道具 红包 优惠券 …
(5)支持无序的场景 – set特效
(6)队列 -->quene -->秒杀 抢购 --redis
(7)消息系统订阅发布 -->redis
4. mysql,redis和memcache的区别
mysql | redis | memcached | ||
---|---|---|---|---|
类型 | 关系型 | 非关系型 | 非关系型 | |
存储位置 | 磁盘 | 磁盘和内存 | 内存 | |
存储过期 | 不支持 | 支持 | 支持 | |
读写性能 | 低 | 非常高 | 非常高 | |
存储的结构 | 表来存储 | 支持很多 list/set/array/string/map等 | 普通键值对key-value |
5.使用redis
5.1 安装
Redis 的官方下载站是 http://redis.io/download,可以去上面下载最新的安装程序下来
直接解压即可
5.2 基础操作
5.2.1 对字符串操作
set key value
get key
mset /mget
incr 增加1个
decr 减少1次
incrBy key num ; 增加num个
decrBy key num ; 减少num个
5.2.2 对key的操作
keys * ; 查看所有的key
expire key seconds ; 对key设置过期时间
ttl key : 查看key 剩余时间
del key :删除key
flushall 清库 (0-15个)
flushdb 清当前库
select index ; 选择库
5.2.3 对list操作
lpush(rpush) key value1/value2… 往list添加值
lpop(rpop) key 随机弹出一个值
lrange key start stop 搜索查询 lrange students 0 -1
lrem key count value 根据count值移除列表key中与参数 value 相等的元素count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex key index 查看索引对应的值
ltrim key start stop (对集合进行修剪)
5.2.4 set操作
sadd key members 添加值
srem key member 删除值
smembers key 查看可以对应的值
5.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
以后使用比较多的结构:
==string /list /map(hash) ===/set —常用
5.2.6 事务操作
multi //标记一个事务块的开始。
exec //执行所有事务块内的命令。
弱事务 : 日志 (不常用)
强事务 :同时成功 同时失败-- 金融数据
discard //取消事务,放弃执行事务块内的所有命令。
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作
5.2.7 订阅发布
SUBSCRIBE channel [channel …] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。
新开一个客户端订阅tv频道
发布nihao!消息到tv频道
订阅tv频道的客户端可以收到nihao!消息
5.2.8 添加密码
(1)在配置文件redis.windows.conf 的方式设置密码
redis.windows.conf --添加 requirepass 123456
(2)在cmd启动服务的时候添加配置文件
redis-server.exe redis.windows.conf
(3)认证redis-server.exe:auth 123456
5.2.9 对SortedSet(有序集合)的操作-参照API![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1562273b551340202c166291bfd70fb4.png)
6 使用java代码操作redis数据库
(1) 导包
连接redis服务: new Jedist(ip,host,timeout)
/**
* host: ip
* port: 默认端口号
* timeout:超时时间
*/
Jedis jedis = new Jedis("127.0.0.1", 6379, 1000);
jedis.auth("123456");
jedis.set("name","老朱");
System.out.println(jedis.get("name"));
连接池操作redis: new JedisPool(config,ip,host,timeout,password)
@Test
public void testPoolJedis()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,"123456");
//4 通过jedispool获取连接
Jedis jedis = pool.getResource();
//5 执行操作
jedis.set("jedispooltest","dbldblddzt.....");
System.out.println(jedis.get("jedispooltest"));
// 6 释放连接
jedis.close(); //底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
pool.destroy();
}
(2)对字符串操作
和上面命令操作一样的
(3)list操作
存储 取值
(4)set操作
存储 取值
(5)hash操作
存储 取值
(6)排序 事务 --练习
10 redis 持久化
持久(持久层 dao层 mapper层): 就把数据保存到磁盘 这个过程就叫持久化
redis支持内存和磁盘存储
redis磁盘存储提供两种方案:
rdb方式 :
save 1 1 最快的保存方法 1s中 发生一次变化 – 如果保存数据 1s内完成 – 数据丢失 丢失1s数据
aof方式:
开启appendOnly yes
在操作的时候,把数据写到日志文件,在启动的时候,恢复日志文件 -->日志方式
11 redis的淘汰策略 --搭建架构/服务(架构师)
lru : 最近最少使用 – 常用 (统计次数)
ttl : 将要过期中淘汰 --也可以 (统计时间)
random: 随机数据 --这个数据就没有那么重要 (随机)