History | grep redis-cli 查找历史记录
连接单机命令
redis -cli -a 密码 -n 具体db
集群
docker exec -it d425f3997067 bash
redis-cli -c -a 1234 -p 7001
Nosql概述
为什么要用Nosql
目前是2020年,大数据时代
大数据一般的数据库无法进行分析处理了2006年Hadoop
SpringBoot SpringCloud应该会
压力越来越大,适者生存,一定要逼着自己学习,优胜略汰
淘宝 php
单机MySQL的年代
App-DAL-Mysql
90年代,一个基本的网站一般访问量不会太大单个数据库完全足够了
那个时候更多的是去使用静态网页Html-服务器根本没有太大的压力
思考一下,这种情况下,整个网站的瓶颈是什么
1.数据量如果太大,一个机器放不下了
2.数据的索引300万就一定要索引(B+Tree)一个机器内存也放不下
3.访问量(读写混合),一个服务器承受不了
只要你开始出现以上的三种情况之一,那么你就必须要晋级
Memcached(缓存)+MySQL+垂直拆分(读写分离)
网站百分之八十的情况都是在读,每次都要去查询数据的话就十分的麻烦!所以说我们希望减轻数据的压力,我们可以使用缓存来保证效率!
发展过程:优化数据结构和索引—》文件缓存(IO)—》Memcached(当时最热门的技术)
分库分表+水平拆分+MySQL集群
技术和业务在发展的同时,对人的要求也越来越高
本质:数据库(读,写)
早些年MyISAM:表锁十分影响效率!高并发下就会出现严重的锁问题
转战Innodb:行锁
慢慢的就开始使用分库分表来解决写的压力!MySQl在那个推出了表分区这个并没有多少公司使用
MySQL的集群,很好的满足了那个年代的所有需求
如今最近的年代
技术爆炸:
2010-2020十年时间,世界已经发生了翻天覆地的变化(定位,也是一种数据,音乐,热榜)
MySQL等关系型数据库就不够用了,数据量很多,变化很快
MySQL有的使用它来存储一些比较大的文件,博客,图片,数据库表很大,效率就低了,如果有一种数据专门处理这种数据,MySQL压力就变得十分小(研究如何处理这些问题!)大数据的IO压力下,表几乎没法更改
目前一个基本的互联网项目!
image.png
为什么要用NoSQL!
用户的个人信息,社交网络,地理位置,用户自己产生的数据,用户日志等等爆发式增长
这时候我们就需要使NoSQL数据库了,NoSQL可以很好的处理以上的情况
什么是NoSQL
NoSQL=Not Only SQL(不仅仅是SQL)
关系型数据库:表格,行,列
泛指非关系型数据库,随着web2.0互联网的诞生!传统的关系型数据库很难对付咋们的web2.0时代尤其是超大规模的高并发的社区!站长! 火了之后暴露出很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术。
很多的数据类型用户的个人信息,社交网络,地理位置,这些数据类型的存储不需要一个固定的格式!不需要多余的操作就可以横向扩展的!Map《String,Object》使用键值对来控制
1.方便扩展(数据之间没有关系,很好扩展)
2.大数据量高性能(Redis一秒可以写八万次,读取11万次,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
3.数据类型是多样型的!(不需要事先设计数据库!随取随用!如果是数据库量十分大的表,很多人就无法设计了!)
4.传统的RDBMS和NoSQL区别 rdbms relational database management system
传统的RDBMS
结构化组织 sql 数据和关系都存在单独的表中row col 数据操作语言 数据定义语言 严格的一致性 基础的事务。。。
NoSQL
不仅仅是数据 没有固定的查询语言 键值对存储 列存储 文档存储 图形数据库(社交关系) 最终一致性 CAP定理和BASE (异地多活!)初级架构师 高性能 高可用 高可扩展。。。
了解:3v+3高
大数据时代的3v:主要是描述问题的
海量Volume
多样Variety
实时Velocity
大数据时代的3高:主要是对程序的要求的
高并发
高可扩(随时水平拆分,机器不够了,可以扩展机器解决)
高性能
真正在公司中的实践:NoSQL+RDBMS一起使用才是最强的,阿里巴巴的架构引进
技术没有高低之分,就看你如何去使用!(提升内功,思维的提高)
阿里巴巴演进分析
商品的基本信息
名称,价格,商家信息
关系型数据库就可以解决了MySQL/Oracle 淘宝早年就去IOE了! 王坚(阿里云的这群疯子)
I IBM,服务器提供商,他们提供的服务器俗称”小型机“
O Oracle,数据库提供商,他们的软件是著名的”甲骨文商业数据库“
E EMC,存储设备提供商,它们提供的是”集中式存储“
淘宝内部的MySQL不是大家用的MySQL
商品的描述,评论(文字比较多)
放入文档行数据库中 MongoDB
图片
分布式文件系统 FastDFS 淘宝自己的 TFS Gooale GFS Hadoop HDFS 阿里云的 OSS
商品的关键字(搜索)
搜索引擎 solr elasticsearch ISerach 多隆(多去了解一下这些技术大佬)
所有牛逼的人都有一段苦逼的岁月,但是你只要像SB一样的去坚持,终将牛逼
商品热门的波段信息
内存数据库
Redis Tair,Memache
商品的交易,外部的支付接口
三方应用
要知道,一个简单的网页背后的技术一定不是大家所想的那么简单
大型互联网应用问题
数据类型太多了
数据源繁多,经常重构
数据要改造,大面积改造?
解决问题
以上都是NoSQL入门概述,不仅能提高大家的知识,还可以帮助大家了解大厂的工作内容
NoSQL的四大分类
KV键值对:
新浪:Redis
美团:Redis+Tair
阿里,百度:Redis+memecache
文档型数据库(bson格式和json一样):
MongoDB(一般必须要掌握)
MongoDB是一个基于分布式文件存储的数据库,C++编写,主要用来处理大量的文档
MongoDB是一个介入关系型数据库和非关系型数据库中间的产品!它是非关系型数据库中功能最丰富的,最像关系型数据库的!
ConthDB 国外的
列存储数据库
HBase
分布式文件系统
图关系数据库
他不是存图形的,放的是关系,比如,朋友圈社交网络,广告推荐
Neo4j,InfoGrid
image.png
敬畏之心可以使人进步!宇宙!科幻!
活着的意义?吃得好,穿的好,帮助更多人!追求幸福(帮助他人,感恩之心),探索未知(努力学习,不要被社会抛弃)
Redis入门
概述
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
免费和开源!是当下最热门的NoSQL技术之一!也被人们称之为结构化数据库!
Redis能干嘛
内存存储、持久化,内存中是断电即失,所以说持久化很重要(rdb、aof)
效率高,可以用于高速缓存
发布订阅系统
地图信息分析
计时器、计数器(浏览量)
。。。
特性
多样的数据类型
持久化
集群
事务
。。
学习中需要用到的东西
1.狂神的公众号
2.官网:https://redis.io
3.china:http://www.redis.cn/
4.下载地址:通过官网下载
注意:Window在Github上下载(停更很久了)
Redis推荐都是在Linux服务器上搭建的,我们是基于Linux学习
Windows安装
安装省略
开启Redis,双击运行服务即可
如果redis打开瞬间闪退,可以访问 https://www.cnblogs.com/LiChen19951127/p/9961646.html
使用redis客户端来连接redis
ping测试连接 出现PONG表示成功
set key value
set nama yaoqua
get key
get name
WIndow下使用确实简单,但是Redis推荐我们使用Linux开发
redis-benchmark是一个压力测试工具
官方自带的性能测试工具
我们来简单测试一下
测试:一百个并发连接 100000请求
redis-benchmark -h localhost -p 6379 -n 100000
基础知识
redis默认有16个数据库
默认使用的是第0个
image.png
切换数据库,查看db大小
清除当前数据库 flushdb
清除全部数据库的内容flushall
Redis是单线程的·
明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了,所有就使用单线程了
Redis是C语言写的,官方提供的数据为 100000+的QPS,完全不比同样使用Memecache差
Redis为什么单线程还这么快?
1、误区:高性能的服务器一定是多线程的
2、误区:多线程(CPU上下文会切换)一定比单线程效率高
CPU>内存>硬盘的速度
核心:redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程的CPU切换是耗时操作,对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息中间件MQ。Redis提供诸如字符串(Strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)与范围查询、位图、超日志、地理空间(geospatial)索引和流等数据结构。Redis具有内置的复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。
五大数据类型
我们现在讲解的所有命令大家一定要全部记住,后面使用SpringBoot,Jedis所有的方法就是这些命令
单点登录
Redis-Key
keys * 查看所有的key
set name yaoquan set key
exists name1 判断当前的key是否存在
move name 1 移除当前的key 从1这个数据库当中
expire name 10 设置key的过期时间,单位是秒
ttl name 查看当前key的剩余时间
type name 查看当前key的类型
append name “hello” 向key为name的value中追加hello成功时会显示长度若是当前key不存在就相当于set key
strlen name 主动查询key为name的value的长度
set views 0 设置浏览量为0
get views 查询浏览量
incr views 自增一 incrby view 10 自增10
decr views 自减一 incrby view 5 自减5
getrange key1 0 3 截取字符串0到3 getrange key1 0 -1 全部长度都要
setrange key2 2 xx 从下标为2开始替换xx

String(字符串)
百分之九十的程序员使用redis只会使用一个String类型!
List类型
Set集合类型
Hash哈希类型
Zset有序集合
Geospatial地理位置详解
Hyperloglog基数统计
Bitmap位图场景

事务

Redis事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行
一次性,顺序性,排他性,执行一系列的命令
Redis事务没有隔离级别的概念
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec
Redis单条命令是保存原子性的,但是事务不保证原子性!
redis的事务
开启事务(multi)
命令入队(…)
执行事务(exec)

  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> get k2
  8. QUEUED
  9. 127.0.0.1:6379> set k3 v3
  10. QUEUED
  11. 127.0.0.1:6379> exec
  12. 1) OK
  13. 2) OK
  14. 3) "v2"
  15. 4) OK

放弃事务!

  1. 127.0.0.1:6379> multi
  2. OK
  3. 127.0.0.1:6379> set k1 v1
  4. QUEUED
  5. 127.0.0.1:6379> set k2 v2
  6. QUEUED
  7. 127.0.0.1:6379> set k4 v4
  8. QUEUED
  9. 127.0.0.1:6379> discard
  10. OK
  11. 127.0.0.1:6379> get k4
  12. (nil)

编译型异常(代码有问题!命令有错!),事务中所有的命令都不会被执行

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> getset k3 #错误的命令
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec #执行事务报错
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get key5 # 所有的命令都不会被执行
(nil)

运行时异常(1/0),如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range 
#虽然报错了但是依旧正常执行成功了
2) OK
3) OK
4) "v3"

监控 Watch
悲观锁:
很悲观,认为什么时候都会出问题,无论什么都会加锁
乐观锁:
很乐观,认为什么时候都不会出现问题,所以不会上锁!更新数据的时候去判断一下,在此期间是否有人修改过这个数据,version!
获取version
更新的时候比较version
Redis监视测试
正常执行成功

127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money #监视money对象
OK
127.0.0.1:6379> multi 
#事务正常结束,数据期间没有发生变动,这个时候就正常执行成功!
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20

测试多线程修改值,使用watch可以当作redis的乐观锁操作

127.0.0.1:6379> watch money #监视money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec #另外一个线程修改了值就会导致这个事务失败
(nil)

如果修改失败,获取最新的值就好

Jedis

我们要使用java来操作Redis
测试