- 博客(164)
- 收藏
- 关注
原创 Redis(22)—— Redis缓存穿透和雪崩
Redis缓存穿透和雪崩服务的高可用问题!在这里我们不会详细的区分析解决方案的底层!Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一 些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据 的一致性要求很高,那么就不能使用缓存。另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。缓存穿透缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存
2020-06-01 22:56:15
262
原创 Redis(21)—— 哨兵模式
哨兵模式(自动选举老大的模式)概述主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工 干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式。Redis从2.8开始正式提供了Sentinel(哨兵) 架构来解决这个问题。谋朝篡位的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独 立运行。其原
2020-06-01 22:53:01
519
原创 Redis(20)—— Redis主从复制
Redis主从复制概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave 以读为主。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。()主从复制的作用主要包括:1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
2020-06-01 22:48:39
359
原创 Redis(19)—— Redis发布订阅
Redis发布订阅Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。微信、微博、关注系统!Redis 客户端可以订阅任意数量的频道。订阅/发布消息图:第一个:消息发送者, 第二个:频道 第三个:消息订阅者!下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发
2020-06-01 22:42:54
333
原创 Redis(18)—— Redis持久化
Redis持久化面试和工作,持久化都是重点!Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能!RDB(Redis DataBase)什么是RDB在主从复制中,rdb就是备用了!从机上面!在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快 照文件直接读到内存里。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文
2020-06-01 22:39:34
172
原创 Redis(17)——Redis.conf详解
Redis.conf详解启动的时候,就通过配置文件来启动!工作中,一些小小的配置,可以让你脱颖而出!单位1、配置文件 unit单位 对大小写不敏感!包含网络bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置通用 GENERALdaemonize yes # 以守护进程的方式运行,默认是 no,我们需要自己开启为yes!pidfile /var/run/redis_6379.pid # 如果以后台的
2020-06-01 22:19:41
133
原创 Redis(16)——悲观锁和乐观锁
悲观锁:很悲观,认为什么时候都会出问题,无论做什么都会加锁!乐观锁:很乐观,认为什么时候都不会出问题,所以不会上锁! 更新数据的时候去判断一下,在此期间是否有人修改过这个数据,获取version更新的时候比较 versionedis测监视测试# 正常执行成功!127.0.0.1:6379> set money 100 OK127.0.0.1:6379> set out 0 OK127.0.0.1:6379> watch money # 监视 money 对象OK12
2020-06-01 22:15:09
247
原创 Redis(15)—— 事务
事务Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!一次性、顺序性、排他性!执行一些列的命令!------ 队列 set set set 执行------Redis事务没有没有隔离级别的概念!所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!ExecRedis单条命令式保存原子性的,但是事务不保证原子性!redis的事务:开启事务(multi)命令入队(…)执行事务(exec)*** 正常执行事务!
2020-06-01 22:03:44
159
原创 Redis(14)—— Hyperloglog
Bitmap为什么其他教程都不喜欢讲这些?这些在生活中或者开发中,都有十分多的应用场景,学习了,就是就 是多一个思路!技多不压身!位存储统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用Bitmaps!Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!365 天 = 365 bit 1字节 = 8bit 46 个字节左右!测试使用bitmap 来记录 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:
2020-06-01 21:48:27
125
原创 Redis(13)—— Hyperloglog
Hyperloglog什么是基数?A {1,3,5,7,8,7}B{1,3,5,7,8}基数(不重复的元素) = 5,可以接受误差!简介Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!Redis Hyperloglog 基数统计的算法!优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的话 Hyperloglog 首选!网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)传统的方式, set 保存用户的id
2020-06-01 21:46:30
173
原创 Redis(12)—— Geospatial 地理位置
Geospatial 地理位置朋友的定位,附近的人,打车距离计算?Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/ 只有 六个命令:官方文档:https://www.redis.net.cn/order/3685.html# getadd 添加地理位置# 规则:两级无法直接添加,我们一般会下载城市数据,
2020-06-01 21:44:43
294
原创 Redis(11)—— Redis有序集合数据类型
在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1127.0.0.1:6379> zadd myset 1 one # 添加一个值(integer) 1127.0.0.1:6379> zadd myset 2 two 3 three # 添加多个值(integer) 2127.0.0.1:6379> ZRANGE myset 0 -11)"one"2)"two"3)"three"##########################
2020-06-01 17:21:11
152
原创 Redis(10)—— Redis哈希数据类型
Hash(哈希)Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的key-vlaue!set myhash field kuangshen##########################################################################127.0.0.1:6379> hset myhash field1 kuangshen # set一个具体 key-vlaue (integer) 1
2020-06-01 17:19:43
127
原创 Redis(9)—— Redis集合数据类型
Set(集合)set中的值是不能重读的!##########################################################################127.0.0.1:6379> sadd myset "hello" # set集合中添加匀速(integer) 1127.0.0.1:6379> sadd myset "kuangshen" (integer) 1127.0.0.1:6379> sadd myset "lovekuangshe
2020-06-01 17:17:36
127
原创 Redis(8)—— Redis列表数据类型
List(列表)在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列! 所有的list命令都是用l开头的,Redis不区分大小命令##########################################################################127.0.0.1:6379> LPUSH list one # 将一个值或者多个值,插入到列表头部 (左)(integer) 1127.0.0.1:6379> LPUSH list two(int
2020-06-01 17:16:11
124
原创 Redis(7)—— Redis字符串数据类型
## String(字符串)##########################################################################127.0.0.1:6379> set key1 v1 # 设置值OK127.0.0.1:6379> get key1 # 获得值"v1"127.0.0.1:6379> keys # 获得所有的key1) "key1"127.0.0.1:6379> EXISTS key1 # 判断某一个key是
2020-06-01 16:49:05
119
原创 Redis(6)—— Redis-Key的基本命令
Redis-Key127.0.0.1:6379> keys # 查看所有的key (empty list or set)127.0.0.1:6379> set name kuangshen # set key OK127.0.0.1:6379> keys1) "name" 127.0.0.1:6379> set age 1 OK127.0.0.1:6379> keys1)"age"2)"name"127.0.0.1:6379> EXISTS name #
2020-06-01 16:33:20
170
原创 Redis(5)—— 基础的知识
基础的知识redis默认有16个数据库默认使用的是第0个可以使用 select 进行切换数据库!127.0.0.1:6379> select 3 # 切换数据库OK127.0.0.1:6379[3]> DBSIZE # 查看DB大小!(integer) 0127.0.0.1:6379[3]> keys # 查看数据库所有的key1) "name"清除当前数据库 flushdb清除全部数据库的内容 FLUSHALL127.0.0.1:6379[3]> f
2020-06-01 16:17:47
125
原创 Redis(4)—— 压力测试工具redis-benchmark
测试性能redis-benchmark 是一个压力测试工具! 官方自带的性能测试工具!redis-benchmark 命令参数!我们来简单测试下:# 测试:100个并发连接 100000请求redis-benchmark -h localhost -p 6379 -c 100 -n 100000如何查看这些分析呢?...
2020-06-01 11:10:50
229
原创 Redis(3)—— Redis在Linux下的安装
1、下载安装包!redis-5.0.8.tar.gz官网:https://redis.io/2、解压Redis的安装包! 程序/opt3、进入解压后的文件,可以看到我们redis的配置文件4、基本的环境安装yum install gcc-c++makemake instal5、redis的默认安装路径 /usr/local/bin6、将redis配置文件。复制到我们当前目录下7、redis默认不是后台启动的,修改配置文件!8、启动Redis服务!9、使用redis-
2020-06-01 10:38:41
233
原创 Redis(2)—— Redis入门
概述什么是redisRedis(Remote Dictionary Server ),即远程字典服务 !是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库, 并提供多种语言的API。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。免费和开源!是当下最热门的 NoSQL 技术之一!也被人们称之为结构化数据库!Redis能干什么1、内存存储、持久化,内存中是断电
2020-06-01 10:29:42
108
原创 Redis(1)—— NoSQL概述
什么是NoSQLNoSQL = Not Only SQL (不仅仅是SQL) 关系型数据库:表格 ,行 ,列泛指非关系型数据库的,随着web2.0互联网的诞生!传统的关系型数据库很难对付web2.0时代!尤其 是超大规模的高并发的社区! 暴露出来很多难以克服的问题,NoSQL在当今大数据环境下发展的十分迅速,Redis是发展最快的,而且是我们当下必须要掌握的一个技术!很多的数据类型用户的个人信息,社交网络,地理位置。这些数据类型的存储不需要一个固定的格式! 不需要多月的操作就可以横向扩展的 !
2020-06-01 10:17:47
150
原创 数据结构与算法(23)—— 外部排序
外部排序需要将待排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存进行排序。在排序过程中需要多次进行内存和外存之间的交换,对外存文件中的记录进行排序后的结果仍然被放到原有文件中。这种排序的方法就叫做外部排序。如何得到初始的归并段置换选择排序:解决排序段放入内存的问题如何减少多个归并段的归并次数最佳归并树:最少的归并次数(I/O次数)如何每次m路归并快速得到最小的关键字败者树:减少比较次数概要: 内存容量无法容纳大量数据#include <assert.
2020-05-31 17:35:58
281
原创 数据结构与算法(22)—— 选择类排序
选择类排序简单选择排序空间复杂度:需要额外的存储空间仅为交换元素时借助的中间变量,所以空间复杂度是O(1)时间复杂度:关键操作在于交换元素操作,整个算法由双重循环组成,外层循环从0到n-2一共n-2+1=n-1次,对于第i层外层循环,内层循环执行n-1-(i+1)+1=n-i-1次。当i=0,内层循环执行n-1次,当i=n-2,内层循环执行1次,所以是一个等差数列求和,一共为(1+n-1)(n-1)/2=n(n-1)/2 ,所以时间复杂度为O(n^2)稳定性:不稳定 原因就在于交换部分
2020-05-31 17:33:50
126
原创 数据结构与算法(21)—— 交换类排序
交换类排序冒泡排序假设待排序表长为n,从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。我们称它为一趟冒泡,结果将最小的元素交换到待排序列的第一个位置。下一趟冒泡时,前一趟确定的最小元素不再参与比较,待排序列减少一个元素,每趟冒泡的结果把序列中的最小元素放到了序列的最终位置,……,这样最多做n-1趟冒泡就能把所有元素排好序。空间复杂度:交换时开辟了存储空间来存储中间变量,所以空间复杂度为O(1)时间复杂度稳定性:当两个关键字相等
2020-05-31 17:30:45
148
原创 数据结构与算法(20)—— 插入排序
插入类排序直接插入排序直接插入排序:首先以一个元素为有序的序列,然后将后面的元素依次插入到有序的序列中合适的位置直到所有元素都插入有序序列。时间复杂度为O(n)直接插入排序是稳定性是稳定的。 void InsertSort(SqList *L) { /* 对顺序表L作直接插入排序。算法10.1 */ int i,j; for(i=2;i<=(*L).length;++i) if LT((*L).r[i].key,(*L).r[i-1].key) /* "&l
2020-05-31 17:28:46
242
原创 数据结构与算法(19)——排序
排序的基本知识定义:排序就是将原本无序的序列重新排列成有序的序列。排序的稳定性如果待排序表中有两个元素Ri、Rj,其对应的关键字keyi=keyj,且在排序前Ri在Rj前面,如果使用某一排序算法排序后,Ri仍然在Rj的前面,则称这个排序算法是稳定的,否则称排序算法是不稳定的。关于各种算法的图解请看大佬的讲解总结:...
2020-05-31 10:57:16
116
原创 数据结构与算法(18)—— 散列表
散列表散列表:根据给定的关键字来计算出关键字在表中的地址的数据结构。也就是说,散列表建立了关键字和存储地址之间的一种直接映射关系。散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr。散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为“冲突”,这些发生碰撞的不同关键字称为同义词。构造散列函数的tips:1)散列函数的定义域必须包含全部需要存储的关键字,而值域的范围则依赖于散列表的大小或地址范围。2)散列函数计算出来
2020-05-31 09:59:15
583
原创 数据结构与算法(17)—— B树和B+树
B树和B+树2-3树2-3树是一种多路查找树:2和3的意思就是2-3树包含两种结点1)2结点包含一个元素和两个孩子(或者没有孩子)。①左子树包含的元素小于该结点的元素值,右子树包含的元素大于该结点的元素值②2结点要不有两个孩子,要不就没有孩子,不允许有一个孩子2)3结点包含一大一小两个元素和三个孩子(或者没有孩子)。(两个元素按大小顺序排列好)①左子树包含的元素小于该结点较小的元素值,右子树包含的元素大于该结点较大的元素值,中间子树包含的元素介于这两个元素值之间。②3结点要不有三个孩子
2020-05-31 09:54:13
209
原创 数据结构与算法(16)—— 二叉排序树
二叉排序树二叉排序树(Binary Search Tree 也叫二叉搜索树)或者是一棵空树,或者是具有以下性质的二叉树①若左子树不空,则左子树上所有结点的值均小于它的根结点的值。②若右子树不空,则右子树上所有结点的值均大于它的根结点的值。③它的左右子树也是一棵二叉排序树。算法思想由于二叉排序树的特点(左子树<根结点<右子树),所以每次查找一个关键字,需要先和根结点进行比较:如果这个关键字小于根结点的值,则再到这个根结点的左子树进行同样的比较操作一直进行下去直到找到该关键字,表示
2020-05-31 09:37:38
307
原创 数据结构与算法(15)—— 查找
第六章:查找查找的基本概念和顺序查找查找定义:在数据集合中寻找满足某种条件的数据元素的过程称为查找关键字:数据元素中某个可以以唯一标识该元素的数据项平均查找长度(ASL:Average Search Length):在查找的过程中,一次查找的长度是指需要比较的关键字次数,而平均查找长度则是所有查找过程中进行关键字的比较次数的平均值顺序查找(线性查找),主要用于在线性表中进行查找。从查找表的一端开始,顺序扫描查找表,依次将扫描到的关键字和待查找的值key进行比较。如果相等,则查找成功。如果扫描结束
2020-05-31 09:30:36
145
原创 数据结构与算法(14)—— 最短路径
最短路径迪杰斯特拉一个源点到其余顶点的最短路径该算法设置一个集合S记录已求得的最短路径的顶点,可用一个数组s[]来实现,初始化为0,当s[vi]=1时表示将顶点vi放入S中,初始时把源点v0放入S中。此外,在构造过程中还设置了两个辅助数组:dist[]:记录了从源点v0到其他各顶点当前的最短路径长度,dist[i]初值为arcs[v0][i]。path[]:path[i]表示从源点到顶点i之间的最短路径的前驱结点,在算法结束时,可根据其值追溯得到源点v0到顶点vi的最短路径。.
2020-05-31 08:56:21
340
原创 数据结构与算法(13)—— 最小生成树
最小生成树普利姆(Prlm)①从图中找第一个起始顶点v0,作为生成树的第一个顶点,然后从这个顶点到其他顶点的所有边中选一条权值最小的边。然后把这条边的另一个顶点v和这条边加入到生成树中。②对剩下的其他所有顶点,分别检查这些顶点与顶点v的权值是否比这些顶点在lowcost数组中对应的权值小,如果更小,则用较小的权值更新lowcost数组。③从更新后的lowcost数组中继续挑选权值最小而且不在生成树中的边,然后加入到生成树。④反复执行②③直到所有所有顶点都加入到生成树中。概要:双重循环,.
2020-05-31 08:47:41
247
原创 数据结构与算法(12)—— 图的遍历
图的遍历深度优先遍历深度优先搜索(DFS:Depth-First-Search):深度优先搜索类似于树的先序遍历算法空间复杂度:由于DFS是一个递归算法,递归是需要一个工作栈来辅助工作,最多需要图中所有顶点进栈,所以时间复杂度为O(|V|)时间复杂度:1)邻接表:遍历过程的主要操作是对顶点遍历它的邻接点,由于通过访问边表来查找邻接点,所以时间复杂度为O(|E|),访问顶点时间为O(|V|),所以总的时间复杂度为O(|V|+|E|)2)邻接矩阵:查找每个顶点的邻接点时间复杂度为O(|V|),对
2020-05-31 08:27:54
570
原创 数据结构与算法(11)—— 图
第五章:图图的基本概念定义:树是N(N≥0)个结点的有限集合,N=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:1)有且仅有一个特定的称为根的结点。2)当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根结点的子树。图G由顶点集V和边集E组成,记为G=(V,E)V(G)表示图G中顶点的有限非空集。用|V|表示图G中顶点的个数,也称为图G的阶E(G)表示图G中顶点之间的关系(边)集合。用|E
2020-05-31 08:23:39
690
原创 数据结构与算法(10)—— 哈夫曼树
哈夫曼树和哈夫曼编码算法的描述如下:1)将这N个结点分别作为N棵仅含一个结点的二叉树,构成森林F。2)构造一个新结点,并从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和。3)从F中删除刚才选出的两棵树,同时将新得到的树加入F中。4)重复步骤2)和3),直至F中只剩下一棵树为止。哈夫曼树的特点没有度为 1 的结点n 个叶结点的哈夫曼树共有 2n-1 个结点哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对同一组权值,可能
2020-05-31 08:11:47
487
原创 数据结构与算法(9)—— 平衡二叉树
平衡二叉树为何要使用AVL树?二叉搜索树的搜索效率与其树的深度相关,而二叉搜索树的组成又与其插入序列相关,在极端情况下,二叉搜索树退化为一条单链(比如插入序列是 1 2 3 … n),使得搜索效率大大降低,为了避免这种情况出现,我们采用二叉平衡树对插入结点进行调整,使得树的深度尽可能小定义平衡因子BF(T) = hL - hR,其中 hL 、hR 分别是左右子树的高度平衡二叉树(AVL 树)空树,或者任一结点左、右子树高度差的绝对值不超过 1,即 |BF(T)|≤1 的树平衡二叉树的调
2020-05-31 08:07:35
240
原创 数据结构与算法(8)—— 二叉搜索树
二叉搜索树定义二叉搜索树(BST)也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:非空左子树的所有键值小于其根结点的键值非空右子树的所有键值大于其根结点的键值左、右子树都是二叉搜索树查找查找从根结点开始,如果树为空,返回 NULL若搜索树不为空,则根结点键值和 X 进行比较,并进行不同处理:若 X 小于根结点键值,在左子树中继续查找若 X 大于根结点键值,在右子树中继续查找如 X 等于根节点键值,查找结束,返回指向此结点的指针查找最大和
2020-05-30 17:43:58
378
原创 数据结构与算法(7)—— 二叉树的遍历
二叉树的遍历树的表示typedef struct TreeNode *BinTree;struct TreeNode{ int Data; // 存值 BinTree Left; // 左儿子结点 BinTree Right; // 右儿子结点 };先序遍历:1)访问根结点;2)先序遍历左子树;3)先序遍历右子树。递归void PreOrderTraversal(BinTree BT){ if(BT){ printf("%d",BT->Data
2020-05-30 17:37:30
348
原创 数据结构与算法(6)—— 树
第四章:树树的基本概念树是递归定义的结构结点根节点:树只有一个根结点结点的度:结点拥有的子树的数量度为0:叶子结点或者终端结点度不为0:分支结点或者非终端结点分支结点除去根结点也称为内部结点树的度:树中所有结点的度数的最大值结点关系祖先结点根结点到该结点的唯一路径的任意结点子孙结点双亲结点根结点到该结点的唯一路径上最接近该结点的结点孩子结点兄弟结点有相同双亲结点的结点层次,高度,深度,树的高度层次:根为第一层,它的孩子为第
2020-05-30 15:29:14
491
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人