一、概述:
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。
二、相关命令列表:
key score member [score] [member]
时间复杂度中的N表示Sorted-Sets中成员的数量。添加参数中指定的所有成员及其分数到指定key的Sorted-Set中,在该命令中我们可以指定多组score/member作为参数。如果在添加时参数中的某一成员已经存在,该命令将更新此成员的分数为新值,同时再将该成员基于新值重新排序。如果键不存在,该命令将为该键创建一个新的Sorted-Sets Value,并将score/member对插入其中。如果该键已经存在,但是与其关联的Value不是Sorted-Sets类型,相关的错误信息将被返回。 本次操作实际插入的成员数量。
key
获取与该Key相关联的Sorted-Sets中包含的成员数量。 返回Sorted-Sets中的成员数量,如果该Key不存在,返回0。
key min max
分数指定范围内成员的数量。
key increment member
时间复杂度中的N表示Sorted-Sets中成员的数量。该命令将为指定Key中的指定成员增加指定的分数。如果成员不存在,该命令将添加该成员并假设其初始分数为0,此后再将其分数加上increment。如果Key不存,该命令将创建该Key及其关联的Sorted-Sets,并包含参数指定的成员,其分数为increment参数。如果与该Key关联的不是Sorted-Sets类型,相关的错误信息将被返回。 以字符串形式表示的新分数。
key start stop [WITHSCORES]
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令返回顺序在参数start和stop指定范围内的成员,这里start和stop参数都是0-based,即0表示第一个成员,-1表示最后一个成员。如果start大于该Sorted-Set中的最大索引值,或start > stop,此时一个空集合将被返回。如果stop大于最大索引值,该命令将返回从start到集合的最后一个成员。
返回索引在start和stop之间的成员列表。
key min max [WITHSCORES] [LIMIT offset count]
时间复杂度中的N表示Sorted-Set中成员的数量,M则表示返回的成员数量。该命令将返回分数在min和max之间的所有成员,即满足表达式min
Original: https://www.cnblogs.com/goody9807/p/7429748.html
Author: PointNet
Title: Redis学习手册(Sorted-Sets数据类型)
相关阅读1
Title: 在linux中使用tcpdump抓包的方法:
在linux中使用tcpdump抓包的方法:
1,运行下面命令来从所有网卡中捕获数据包:
tcpdump -i any
2,从指定网卡中捕获数据包
tcpdump -i eth0
3,指定网卡,IP地址,写入文件
tcpdump -i eth0 host 10.19.150.242 -w ./datdump.cap
4,指定网卡,源ip 且 目的ip,写入文件
tcpdump -i eth0 src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump1.cap
5,指定网卡,源ip 或 目的ip,写入文件
tcpdump -i eth0 src host 10.10.100.19 or dst host 10.10.100.153 -w ./datdump1.cap
6,指定网卡,tcp端口 且 源ip 且 目的ip,写入文件
tcpdump -i eth0 tcp port 52312 and src host 10.10.100.19 and dst host 10.10.100.153 -w ./datdump3.cap
7,指定网卡,tcp端口 且 源ip 且 目的ip,写入文件
tcpdump -i eth0 host ! 10.10.100.19 and ! 10.10.100.153 -w ./datdump4.cap
8,只抓取sync的数据包 具体什么意思,详见
tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap
9,只抓取HTTP包
tcpdump -i eth0 'tcp[(tcp[12]>>2):4] = 0x48545450' -w ./datdump5.cap
10,只抓取ip数据帧中没有数据的包,详见
tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<
tcpdump [ 选项 ] [ -c 数量 ] [ -i 网络接口 ] [ -w 文件名 ] [ 表达式 ]
man tcpdump
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
​ [ -c count ]
​ [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
​ [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
​ [ --number ] [ -Q in|out|inout ]
​ [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
​ [ -W filecount ]
​ [ -E spi@ipaddr algo:secret,... ]
​ [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
​ [ --time-stamp-precision=tstamp_precision ]
​ [ --immediate-mode ] [ --version ]
​ [ expression ]
选项翻译如下:
-l:使标准输出变为缓冲行形式;
-c:抓包次数;
-nn:直接以 IP 及 Port Number 显示,而非主机名与服务名称;
-s :<数据包大小> 设置每个数据包的大小;
-i:指定监听的网络接口;
-r:从指定的文件中读取包;
-w:输出信息保存到指定文件;
-a:将网络地址和广播地址转变成名字;
-d:将匹配信息包的代码以人们能够理解的汇编格式给出;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-t:在输出的每一行不打印时间戳;
-v :输出稍微详细的报文信息;--vv则输出更详细信息。
</数据包大小>
抓取带有特殊标记的数据包
https://www.jb51.net/LINUXjishu/118388.html?pc
示例:抓取只包含SYN位的数据包
1.客户端发送SYN
2.服务端回应SYN和ACK
3.客户端发送ACK
现在我们仅捕获包含SYN位的数据包。 注意,不希望步骤2(SYN-ACK)的数据包,只是一个普通的初始SYN。
tcp头的结构
TCP头包含20个字节固定长度的数据(上图中的前4行),而控制位位于第13个字节(字节计算从0开始)
只看我们感兴趣的控制位:
这些是我们感兴趣的TCP控制位。我们对这个八位组中的位进行了编号,从0到7,从右到左,所以PSH位是位编号3,而URG位是编号5,SYN位是2。
如果只包含 SYN 位,那就是 tcp头的第13个字节(0开始)的值为2,即tcp[13] == 2。
tcpdump -i eth0 tcp[13] == 2 -w ./datdump5.cap
如果抓取包含SYN位的数据包
tcpdump -i eth0 'tcp[13] & 2 == 2' -w ./datdump5.cap
示例:只抓取ip数据包没有数据的包
tcpdump -i eth0 '((ip[2:2] - ((ip[0]&0xf)<
ip[2:2]
表示整个ip数据包总长度,即ip头的第2个字节(0开始)开始的两个字节(2,3)的值。
(ip[0]&0xf)<
Original: https://www.cnblogs.com/xutopia/p/15738423.html
Author: xutopia
Title: 在linux中使用tcpdump抓包的方法:
相关阅读2
Title: Redis分布式锁的N种姿势
Redis几种架构
Redis发展到现在,几种常见的部署架构有:
- 单机模式;
- 主从模式;
- 哨兵模式;
- 集群模式;
我们首先基于这些架构讲解Redisson普通分布式锁实现,需要注意的是,只有充分了解普通分布式锁是如何实现的,才能更好的了解Redlock分布式锁的实现,因为Redlock分布式锁的实现完全基于普通分布式锁。
普通分布式锁
Redis普通分布式锁原理这个大家基本上都了解,本文不打算再过多的介绍,上一篇文章《Redis分布式锁最牛逼的实现》也讲的很细,并且也说到了几个重要的注意点。如果你对Redis普通的分布式锁还有一些疑问,可以再回顾一下这篇文章。
接下来直接show you the code,毕竟 talk is cheap。
- redisson版本
本次测试选择redisson 2.14.1版本。
单机模式
源码如下:
通过代码可知,经过Redisson的封装,实现Redis分布式锁非常方便,我们再看一下Redis中的value是啥,和前文分析一样,hash结构,key就是资源名称,field就是UUID+threadId,value就是重入值,在分布式锁时,这个值为1(Redisson还可以实现重入锁,那么这个值就取决于重入次数了):
172.29.1.180:5379> hgetall DISLOCK
1) "01a6d806-d282-4715-9bec-f51b9aa98110:1"
2) "1"
哨兵模式
即sentinel模式,实现代码和单机模式几乎一样,唯一的不同就是Config的构造:
集群模式
集群模式构造Config如下:
普通分布式实现非常简单,无论是那种架构,向Redis通过EVAL命令执行LUA脚本即可。
Redlock分布式锁
那么Redlock分布式锁如何实现呢?以单机模式Redis架构为例,直接看实现代码:
最核心的变化就是RedissonRedLock redLock = new RedissonRedLock(lock1, lock2, lock3);,因为我这里是以三个节点为例。
那么如果是哨兵模式呢?需要搭建3个,或者5个sentinel模式集群(具体多少个,取决于你)。
那么如果是集群模式呢?需要搭建3个,或者5个cluster模式集群(具体多少个,取决于你)。
实现原理
既然核心变化是使用了RedissonRedLock,那么我们看一下它的源码有什么不同。这个类是RedissonMultiLock的子类,所以调用tryLock方法时,事实上调用了RedissonMultiLock的tryLock方法,精简源码如下:
很明显,这段源码就是上一篇文章《Redlock:Redis分布式锁最牛逼的实现》提到的Redlock算法的完全实现。
以sentinel模式架构为例,如下图所示,有sentinel-1,sentinel-2,sentinel-3总计3个sentinel模式集群,如果要获取分布式锁,那么需要向这3个sentinel集群通过EVAL命令执行LUA脚本,需要3/2+1=2,即至少2个sentinel集群响应成功,才算成功的以Redlock算法获取到分布式锁:
Redlock分布式锁
问题合集
根据上面实现原理的分析,这位同学应该是对Redlock算法实现有一点点误解,假设我们用5个节点实现Redlock算法的分布式锁。那么要么是5个redis单实例,要么是5个sentinel集群,要么是5个cluster集群。而不是一个有5个主节点的cluster集群,然后向每个节点通过EVAL命令执行LUA脚本尝试获取分布式锁,如上图所示。
- 失效时间如何设置
这个问题的场景是,假设设置失效时间10秒,如果由于某些原因导致10秒还没执行完任务,这时候锁自动失效,导致其他线程也会拿到分布式锁。
这确实是Redis分布式最大的问题,不管是普通分布式锁,还是Redlock算法分布式锁,都没有解决这个问题。也有一些文章提出了对失效时间续租,即延长失效时间,很明显这又提升了分布式锁的复杂度。另外就笔者了解,没有现成的框架有实现,如果有哪位知道,可以告诉我,万分感谢。
- redis分布式锁的高可用
关于Redis分布式锁的安全性问题,在分布式系统专家Martin Kleppmann和Redis的作者antirez之间已经发生过一场争论。有兴趣的同学,搜索"基于Redis的分布式锁到底安全吗"就能得到你想要的答案,需要注意的是,有上下两篇(这应该就是传说中的神仙打架吧,哈)。
- zookeeper or redis
没有绝对的好坏,只有更适合自己的业务。就性能而言,redis很明显优于zookeeper;就分布式锁实现的健壮性而言,zookeeper很明显优于redis。如何选择,取决于你的业务!
更多免费技术资料可关注:annalin1203
Original: https://www.cnblogs.com/zhuxiaopijingjing/p/12978453.html
Author: 幽暗森林之猪大屁
Title: Redis分布式锁的N种姿势
相关阅读3
Title: nginx-http响应头安全策略
从nginx的http头文件的方面,利用参数设置开启浏览器的安全策略,来实现相关的安全机制。
add_header Content-Security-Policy "default-src 'self' xxx.xxx.com(允许的地址)
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header 'Referrer-Policy' 'origin';
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
策略 参数 预防攻击 Content-Security-Policy script-src:外部脚本
style-src:样式表
img-src:图像
media-src:媒体文件(音频和视频)
font-src:字体文件
object-src:插件(比如 Flash)
child-src:框架
frame-ancestors:嵌入的外部资源 (比如、
connect-src:HTTP 连接(通过 XHR、WebSockets、EventSource等)
worker-src:worker脚本
manifest-src:manifest 文件 内容网页安全策略 缓解XSS攻击 X-Content-Type-Options nosniff
浏览器严格匹配资源类型,会拒绝加载错误或者不匹配的资源类 约定资源的响应头,屏蔽内容嗅探攻击 X-XSS-Protection 0 关闭防护
1 开启防护
1; mode=block 开启防护 如果被攻击,阻止脚本执行 XSS攻击 X-Frame-Options deny 标识该页面不允许在frame中展示,即便在相同域名的页面中嵌套也不行
sameorigin 可以在同域名的页面中frame中展示
allow-form url 指定的fream中展示。 点击劫持攻击 Strict-Transport-Security max-age=63072000; includeSubdomains; preload 强制https Referrer-Policy no-referrer-when-downgrade:在同等安全等级下(例如https页面请求https地址),发送referer,但当请求方低于发送方(例如https页面请求http地址),不发送referer
origin:仅仅发送origin,即protocal+host
origin-when-cross-origin:跨域时发送origin
same-origin:当双方origin相同时发送
strict-origin:当双方origin相同且安全等级相同时发送
unfafe-url:任何情况下都显示完整的referer 过滤 Referrer 报头内容 X-Download-Options noopen
用于指定IE 8以上版本的用户不打开文件而直接保存文件。
在下载对话框中不显示"打开"选项 控制浏览器下载文件是否支持直接打开 X-Permitted-Cross-Domain-Policies master-only 只允许使用主策略文件 针对flash的安全策略
Content-Security-Policy 内容网页安全策略,缓解XSS攻击
网络请求中,每个资源都有自己的类型,比如Content-Type:text/html 、image/png、 text/css。
但是有一些资源的类型是未定义或者定义错了,导致浏览器会猜测资源类型,尝试解析内容,从而给了脚本攻击可乘之机。
比如利用一个图片资源去执行一个恶意脚本。
配置:浏览器严格匹配资源类型,会拒绝加载错误或者不匹配的资源类型
X-Content-Type-Options: nosniff
X-Content-Type-Options 约定资源的响应头,屏蔽内容嗅探攻击
X-XSS-Protection 防止XSS攻击
开启浏览器XSS防护,过滤xss攻击脚本)
配置:浏览器XSS防护
X-XSS-Protection: 0 关闭防护
X-XSS-Protection: 1 开启防护
X-XSS-Protection: 1; mode=block 开启防护 如果被攻击,阻止脚本执行
nginx配置: add_header X-XSS-Protection "1; mode=block";
X-Frame-Options 防止点击劫持攻击
通过这个控制来避免自己的资源页面被其他页面引用。
点击劫持:攻击者会用一个自己网站,用ifream或者fream嵌套的方式引入目标网站,诱使用户点击。从而劫持用户点击事件。
deny 标识该页面不允许在frame中展示,即便在相同域名的页面中嵌套也不行。
sameorigin 可以在同域名的页面中frame中展示
allow-form url 指定的fream中展示。
nginx配置:add_header X-Frame-Options SAMEORIGIN;
Strict-Transport-Security 强制https
浏览器只能通过https访问当前资源
配置 强制https
nginx配置:add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
在接下来的一年(即xxx秒)中,浏览器只要向xxx或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。
Referrer-Policy 过滤Referrer报头内容
规定什么情况下显示referer字段,以及referer字段显示的内容多少.
当用户在浏览器上点击一个链接时,会产生一个 HTTP 请求,用于获取新的页面内容,而在该请求的报头中,会包含一个 Referrer,用以指定该请求是从哪个页面跳转页来的,常被用于分析用户来源等信息。
但是也成为了一个不安全的因素,所以就有了 Referrer-Policy,用于过滤 Referrer 报头内容
配置:过滤Referrer报头内容
no-referrer-when-downgrade:在同等安全等级下(例如https页面请求https地址),发送referer,但当请求方低于发送方(例如https页面请求http地址),不发送referer
origin: 仅仅发送origin,即protocal+host
origin-when-cross-origin: 跨域时发送origin
same-origin: 当双方origin相同时发送
strict-origin: 当双方origin相同且安全等级相同时发送
unfafe-url: 任何情况下都显示完整的referer
nginx配置:add_header 'Referrer-Policy' 'origin';
注意:此配置可能会导致某些系统访问率统计插件失效
X-Download-Options 控制浏览器下载文件是否支持直接打开
控制浏览器下载文件是否支持直接打开,如果支持直接打开,可能会有安全隐患
配置参数:
X-Download-Options: noopen 用于指定IE 8以上版本的用户不打开文件而直接保存文件。在下载对话框中不显示“打开”选项。
nginx配置:add_header X-Download-Options noopen;
X-Permitted-Cross-Domain-Policies 针对flash的安全策略
针对flash的安全策略,用于指定当不能将"crossdomain.xml"文件(当需要从别的域名中的某个文件中读取 Flash 内容时用于进行必要设置的策略文件)放置在网站根目录等场合时采取的替代策略。
X-Permitted-Cross-Domain-Policies: master-only
master-only 只允许使用主策略文件(/crossdomain.xml)
nginx配置: add_header X-Permitted-Cross-Domain-Policies none;
Original: https://www.cnblogs.com/linuxshare/p/16495186.html
Author: 爱折腾的大臭臭
Title: nginx-http响应头安全策略