1.NoSQL的概念
1.nosql是什么
百度百科说:
NoSQL(不仅仅是SQL not only SQL),泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题;
1.总的来说:
(a) nosql 它是非关系型数据库
(b) nosql 解决网站里面 大数据和高并发的问题(SNS社交网络上面/电商/12306)
2.Nosql数据库的分类(特点)
key-value(键值对形式)型 nosql数据库 – 典型代码 redis
列式存储型, 文档型 ,图表型(了解)
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 --有序集合–api)和hash(哈希类型)。
(3)支持磁盘存储 – 完成持久化操作 (aof rdb)
(4) 支持数据的过期 --(设置过期时间 expire)
(5) 支持集群操作 --(明天讲)
(6)支持订阅和发布 --(了解 MQ)
Redis 和 Memcache区别(面试题)
不同点:
memcach和redis的不同点
支持类型: 表来存储 string/list/map/set/… map
memcach只支持map 支持类型比redis少
相同点:
1. memcache和redis 都是 key-value 非关系型数据
2. redis 它是 key-value型的非关系型数据库,作用 做缓存
4.redis的使用场景
(1)redis使用最多的地方 就是缓存 --(内存最多)
(2)可以处理大数据量的计数问题 --(微博转发 点赞)
(3)实时的攻防系统
银行登录 (登出多少次 会锁定) --暴力破解(穷举法)
userid 1/2/3
(4)有效期应用 – 优惠劵
(5)自动去重应用 – set
(6)队列的结构 – (FIFO) (list存储) -->消息队列(RabbitMQ) --地铁
(7)消息订阅和发布
5.redis的使用
1.安装
先直接解压文件
打开服务
最后打开这个来进行操作
(1)String 操作(掌握)
set key value 保存值
get 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)key的操作(掌握)
keys * 查看所有的key值
expire key second 设置数据多久失效
ttl key 查看数据还有多久失效
flushall //清空整个redis服务器数据,所有的数据库全部清空
flushdb //清除当前库,redis中默认有16个数据库,名称分别为0,1,2.。。15
select index --select 0 切换数据库
(3)list操作(掌握)
lpush/rpush key value1/value2 从最左边/最右边添加数据
lrange key start end 获取从start的位置到end的位置的值
lindex key index 返回列表 key 中,下标为 index 的元素
lrem key count value //根据count值移除列表key中与参数 value 相等的count 。
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为
count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
ltrim key start stop //对一个列表进行修剪
edis怎么实现栈(FILO)和队列(FIFO)???
list控制同一边进,同一边出
就是栈list控制一边进,另一边出就是队列.
(4)set操作
sadd key val1 /val2/val3 存值
smembers key 返回集合Key中所有的成员
srem key member 删除值
(5) hash操作(掌握)
hset key name value 存值
hget key name 取值
hmset key name1 key1 name2 key2 存多个值
hmget key name1 name2 取多个值
hkeys //返回哈希表 key 中的所有键
hvals //返回哈希表 key 中的所有值
hgetall //返回哈希表 key 中,所有的键和值
(6)订阅 发布 事务 了解
redis是弱事务,就是就算有失败的,但是成功了的东西仍然会提交
multi //标记一个事务块的开始。
exec //执行所有事务块内的命令。
discard //取消事务,放弃执行事务块内的所有命令。
Redis的事务在执行exec指令时,才批量执行操作,没有回滚操作
(7)设置密码 --通过配置文件操作(掌握)
SUBSCRIBE channel [channel …] //订阅给定的一个或多个频道的信息。
PUBLISH channel message //将信息 message 发送到指定的频道 channel 。
新开一个客户端订阅
6.设置密码
1.通过命令动态调整密码
CONFIG SET 命令可以动态地调整 Redis 服务器的配置而无须重启,重启后失效
CONFIG SET requirepass 123456 //将密码设置为123456
CONFIG SET requirepass “” //清除密码
AUTH 123456 //输入密码进行认证
2.通过配置文件设置密码(掌握)
在配置文件redis.widows.conf中增加一行代码
在配置文件中的这个位置,将框起来的内容改为你要设置的密码再把#去掉就成功设置密码了
然后在当前目录用cmd打开命令管理器输入redis-server.exe redis.windows.conf
读取配置文件打开,就必须要输入密码才能执行操作了
7.java代码操作redis
springboot (连接方式 – 只需要做配置) jedis
首先导入jar包
string 操作
resource.set("name","23333");//新增
System.out.println(resource.get("name")); //获取
resource.set("name","322222");//修改
System.out.println(resource.get("name"));
resource.del("name");
System.out.println(resource.keys("*"));
list操作
resource.lpush("age","1","2","5");//增加
List<String> age = resource.lrange("age", 0, -1);//查看
System.out.println(age);
set操作
resource.sadd("name","zs","ls","ww");
System.out.println(resource.smembers("name"));
hash操作
resource.hset("user1","name","wtb");
System.out.println(resource.hget("user1","name"));
HashMap map = new HashMap<>();
map.put("name","lol");
map.put("age","55");
map.put("sex","boy");
resource.hmset("user1",map);
System.out.println(resource.hmget("user1","name","age","sex"));
sort排序操作—数字
resource.lpush("nums","1","9","8");
System.out.println(resource.sort("nums"));//降序
SortingParams sortingParams = new SortingParams();
sortingParams.desc();
System.out.println(resource.sort("nums",sortingParams));
排序字母
resource.lpush("zimu","user","admin","password");
SortingParams sortingParams = new SortingParams();
sortingParams.alpha();
System.out.println(resource.sort("zimu",sortingParams));
中文没有排序
事务操作 了解
Transaction multi = resource.multi();
multi.set("name","aaaa");
multi.set("age","21");
multi.incr("name");
multi.incr("age");
List<Object> exec = multi.exec();
System.out.println(exec);
System.out.println(resource.get("age"));
每个操作最后都要进行的步骤:
//释放连接 底层做了兼容,如果是连接池操作就是释放,如果是连接操作就是关闭
resource.close();
// 7 摧毁连接池-如果是真正项目中它应该是一个受spring管理的单例
jedisPool.destroy();