Redis_day01
1. NoSql
1.1 NoSql是什么
NoSQL(不仅仅是SQL not only SQL),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题;
(a) nosql 它是非关系型数据库
(b) nosql 解决网站里面 大数据和高并发的问题(SNS社交网络上面/电商/12306)
1.2 NoSql数据库的分类(特点)
Key-value(键值对形式)型NoSql数据库
2. redis的认识
(1) redis开源 高性能nosql数据库,数据可以存储在内存或磁盘上面
(2) Redis 主要key-value结构形式存储,redis底层支持各种类型的数据存储结构
包括 list set map(hash) string等
3. Redis特点
(1) 数据存储内存,速度比较快
(2) 支持类型比较多
string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
(3) 支持磁盘存储 -- 完成持久化操作
(4) 支持数据的过期
(5) 支持集群操作
(6) 支持订阅和发布
4. redis的使用场景
(1)redis使用最多的地方 就是缓存 --(内存最多)
(2)可以处理大数据量的计数问题 --(微博转发 点赞)
(3)实时的攻防系统
银行登录 (登出多少次 会锁定) --暴力破解(穷举法)
(4)有效期应用 -- 优惠劵
(5)自动去重应用 -- set
(6)队列的结构 -- (FIFO) (list存储) -->消息队列(RabbitMQ) --地铁
(7)消息订阅和发布
5. redis使用
5.1 安装
下载后直接解压即可
5.2 启动服务和客户端
5.3 对String的操作命令
set key value
get key
5.4 key的操作命令
keys *
expire key second
ttl key
5.5 list操作
lpush/rpush key value1/value2
lrange key start end
lindex key index
5.6 set操作
sadd key val1 /val2/val3
smembers key
srem key member
5.7 hash操作
hset key name value
hget key name
hmset key name1 key1 name2 key2
hmget key name1 name2
5.8 事务
multi //标记一个事务块的开始。
exec //执行所有事务块内的命令。
弱事务 : 日志
强事务 :同时成功 同时失败-- 金融数据
discard //取消事务,放弃执行事务块内的所有命令。
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作
5.9 订阅/发布
QQ群
SUBSCRIBE channel [channel ...] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。
新开一个客户端订阅tv频道
发布nihao!消息到tv频道
订阅tv频道的客户端可以收到nihao!消息
5.10 设置密码
1. 通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass "" //清除密码
AUTH 123456 //输入密码进行认证
2. 通过配置文件设置密码
在配置文件redis.widows.conf中增加一行代码
requirepass 123456
将密码123456设置到配置文件中,redis启动时加载该文件,即可启用密码
6 java代码操作redis
6.1 jar包
6.2 简单配置
public void testRedis() throws Exception { //连接ip String host = "127.0.0.1"; //连接端口 int port = 6379; //超时时间 int timeout = 1000; Jedis jedis = new Jedis(host, port, timeout); //执行操作 jedis.set("name", "艾瑞利亚"); System.out.println(jedis.get("name")); //关闭连接 jedis.close(); }
6.3 连接池连接
1 public void testPool() throws Exception { 2 JedisPoolConfig config = new JedisPoolConfig(); 3 config.setMaxIdle(10); 4 config.setMaxTotal(10); 5 //获取连接是测试连接是否畅通 6 config.setTestOnBorrow(true); 7 //连接ip 8 String host = "127.0.0.1"; 9 //连接端口 10 int port = 6379; 11 //超时时间 12 int timeout = 1000; 13 JedisPool jedisPool = new JedisPool(config, host, port, timeout); 14 Jedis jedis = jedisPool.getResource(); 15 jedis.set("name", "内瑟斯"); 16 System.out.println(jedis.get("name")); 17 18 //查询所有的key cmd命令key * 19 Setkeys = jedis.keys("*"); 20 System.out.println(keys); 21 22 //清空当前数据库 23 jedis.flushDB(); 24 }
6.4 对list的操作
1 public void testPoolList() throws Exception { 2 JedisPoolConfig config = new JedisPoolConfig(); 3 config.setMaxIdle(10); 4 config.setMaxTotal(10); 5 //获取连接是测试连接是否畅通 6 config.setTestOnBorrow(true); 7 //连接ip 8 String host = "127.0.0.1"; 9 //连接端口 10 int port = 6379; 11 //超时时间 12 int timeout = 1000; 13 JedisPool jedisPool = new JedisPool(config, host, port, timeout); 14 Jedis jedis = jedisPool.getResource(); 15 jedis.lpush("students", "{name:张三}", "{age:35}", "{sex:男}"); 16 Liststudents = jedis.lrange("students", 0, -1); 17 System.out.println(students); 18 }
6.5 对set的操作
1 public void testPoolSet() throws Exception { 2 JedisPoolConfig config = new JedisPoolConfig(); 3 config.setMaxIdle(10); 4 config.setMaxTotal(10); 5 //获取连接是测试连接是否畅通 6 config.setTestOnBorrow(true); 7 //连接ip 8 String host = "127.0.0.1"; 9 //连接端口 10 int port = 6379; 11 //超时时间 12 int timeout = 1000; 13 JedisPool jedisPool = new JedisPool(config, host, port, timeout); 14 Jedis jedis = jedisPool.getResource(); 15 jedis.flushDB(); 16 jedis.sadd("students", "{name:张三}", "{age:35}", "{sex:男}"); 17 Setstudents = jedis.smembers("students"); 18 System.out.println(students); 19 }
6.6 对hash的操作
1 public void testPoolHash() throws Exception { 2 JedisPoolConfig config = new JedisPoolConfig(); 3 config.setMaxIdle(10); 4 config.setMaxTotal(10); 5 //获取连接是测试连接是否畅通 6 config.setTestOnBorrow(true); 7 //连接ip 8 String host = "127.0.0.1"; 9 //连接端口 10 int port = 6379; 11 //超时时间 12 int timeout = 1000; 13 JedisPool jedisPool = new JedisPool(config, host, port, timeout); 14 Jedis jedis = jedisPool.getResource(); 15 jedis.flushDB(); 16 //方式一 17 jedis.hset("student:1", "name", "德莱厄斯"); 18 System.out.println(jedis.hget("student:1", "name")); 19 20 //方式二 map方式(键值都必须为string类型) 21 Mapmap = new HashMap(); 22 map.put("name", "德莱文"); 23 map.put("age", "32"); 24 map.put("sex", "男"); 25 jedis.hmset("student01", map); 26 List student01 = jedis.hmget("student01", "name", "age", "sex"); 27 System.out.println(student01); 28 }
6.7 对sort(排序)的操作
public void testPoolSort() throws Exception { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(10); config.setMaxTotal(10); //获取连接是测试连接是否畅通 config.setTestOnBorrow(true); //连接ip String host = "127.0.0.1"; //连接端口 int port = 6379; //超时时间 int timeout = 1000; JedisPool jedisPool = new JedisPool(config, host, port, timeout); Jedis jedis = jedisPool.getResource(); jedis.flushDB(); //对字符数字操作 jedis.lpush("nums", "32", "12", "90", "35", "52"); System.out.println(jedis.sort("nums")); //排序规则 SortingParams params = new SortingParams(); //倒序 从大到小 params.desc(); System.out.println(jedis.sort("nums", params)); //对英文操作 jedis.lpush("english", "java", "php", "python", "web"); SortingParams params1 = new SortingParams(); //根据ascall值排序 params1.alpha(); //正序 从小到大 params.asc(); System.out.println(jedis.sort("english", params1)); }
6.8 对Transaction(事务)的操作
1 public void testPoolTransaction() throws Exception { 2 JedisPoolConfig config = new JedisPoolConfig(); 3 config.setMaxIdle(10); 4 config.setMaxTotal(10); 5 //获取连接是测试连接是否畅通 6 config.setTestOnBorrow(true); 7 //连接ip 8 String host = "127.0.0.1"; 9 //连接端口 10 int port = 6379; 11 //超时时间 12 int timeout = 1000; 13 JedisPool jedisPool = new JedisPool(config, host, port, timeout); 14 Jedis jedis = jedisPool.getResource(); 15 //开启事务 16 Transaction multi = jedis.multi(); 17 multi.set("name", "tom"); 18 multi.set("age", "24"); 19 multi.incr("name"); 20 multi.incr("age"); 21 //提交事务 22 List
7 redis持久化
为什么需要持久化?
防止数据丢失
怎么持久化?
磁盘存储 和 内存磁盘
redis如果要实现磁盘存储(做持久化过程) 两种方案
rdb方式 : 在一个时间点内 保存一个数据的快照
save 1 1 1s钟之内至少有一个变化的时候,做持久化
1s 之内的数据 操作时候,丢失,不能做持久化
aof方式 :
追加执行的配置文件的方式 (配置文件就有操作的命令)