关注微信公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!
一、特点
1、单线程+多路IO复用技术
多路复用:使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就位,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启用线程执行(比如使用线程池)
多路IO复用:做某件事情需要一定的时间,可以找一个中间人监视这件事,我们可以做其他的事。多路IO复用有select,poll,epoll这些模式。select监测数量能力有限。poll监测数量没有限制,但是需要一个一个核查。配epoll监测数量没有限制,也不需要一个一个核查,直接看是否有一个正确的标识。
单线程:避免了线程切换、加锁等资源消耗
二、操作
1、Redis键的操作
2、Redis字符串(String)
2.1、基本介绍
String是二进制安全的,意味着可以包含任意数据,是redis中的基本数据类型,一个字符串value最大512M
2.2、常用操作
set <key> <value>:添加新的key,value
get <key>:查询对应键值
append <key> <value>:将给定的<value>追加到原值末尾
strlen <key>:获得值的长度
setnx <key> <value>:只有在key不存在时,设置key的值(原子操作)
incr <key>:将key中存储的数字值增1(原子操作)
decr <key>:将key中存储的数字值减1(原子操作)
incrby/decrby <key> <步长>:
mset <key> <value> <key> <value>:
mget <key> <key>:一次获取多个value
msetnx <key> <value> <key> <value>:
getrange <key> <start> <end>:
setrange <key> <pose> <value>:
setex <key> <time> <value>:
getset <key> <value>:以旧换新,设置新值时获得旧值
2.3、特点
动态字符串的实现方式,采用预分配冗余空间的方式来减少内存频繁分配
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间。如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。
3、Redis列表(List)
3.1、基本介绍
单键多值,简单的字符串列表,按照插入顺序排序,支持前插后插,底层是双向链表,对两端操作性能高,通过索引下标性能低
3.2、常用操作
lpush/rpush <key> <value1> <value2> <value3>:
lpop/rpop <key>:从左边/右边吐出一个值。值在键在,值光键亡。
rpop/lpush <key1> <key2>:
lrange <key> <start> <stop>:
lindex <key> <index>:按照索引下标获得元素(从左到右)
llen <key>:获得列表长度
linsert <key> before <value> <newvalue>:
lrem <key> <n> <value>:从左边删除n个value(从左到右)
lset <key> <index> <value>:将列表key下标为index的值替换成value
3.3、数据结构
List的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。它将所有的元素紧挨着—起存储,分配的是—块连续的内存。当数据呈比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
4、Redis集合(Set)
4.1、基本介绍
Redis set是可以自动排重的,并且Set提供了判断某个成员是否在一个Set集合内的重要接口。Redis的set是string类型的无序集合。它底层其实是一个value为null的hash表。所以添加,删除,查找的复杂度都是O(1)。
4.2、常用操作
sadd <key> <value1> <value2>:将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略。
smembers <key>:取出该集合的所有值。
sismember <key> <value>:判断集合<key>是否为含有该值
scard <key>:返回该集合的元素个数。
srem <key> <value1> <value2>:删除集合中的某个元素。
spop <key>:随机从该集合中吐出一个值,会删除。
srandmember <key> <n>随机从该集合中取出n个值。不会从集合中删除。
smove <source> <destination> <value>:
sinter <key1> <key2>:返回两个集合的交集元素。
sunion <key1> <key2>:返回两个集合的并集元素。
sdiff <key1> <key2>:返回两个集合的差集元素(key1中的,不包含key2中的)
4.3、数据结构
Set数据结构是dict字典,字典使用哈希表实现的
5、Redis哈希(Hash)
5.1、基本介绍
Redis hash是一个键值对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息
5.2、常用操作
hset <key> <field> <value>:给<key>集合中的<field>键赋值<value>
hget <key1> <field>:从<key1>集合<field>取出value
hmset <key1> <field1> <valuel> <field2> <value2>:
hexists <key1> <field>:查看哈希表key中,给定域field是否存在。
hkeys <key>:列出该hash集合的所有field
hvals <key>:列出该hash集合的所有value
hincrby <key> <field> <increment>:
hsetnx <key> <field> <value>:
5.3、数据结构
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。
6、Redis有序集合(Zset)
6.1、基本介绍
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score ) ,这个评分( score )被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。因为元素是有序的,所以你也可以很快的根据评分( score ) 或者次序( position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
6.2、常用操作
zadd <key> <score1> <value1> <score2> <value2>:
zrange <key> <start> <stop> [WITHSCORES]:
zrangebyscore key min max [ withscores] [limit offset count]:
zrevrangebyscore key max min [withscores] [limit offset count]:
zincrby <key> <increment> <value>:
zrem <key> <value>:删除该集合下,指定value值的元素
zcount <key> <min> <max>:统计该集合,分数区间内的元素个数
zrank <key> <value>:返回value值在集合中的排名,从0开始
6.3、数据结构
Zset是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。Zset底层使用了两个数据结构(1) hash:hash的作用就是关联元素value和权重score,保障元素value的唯—性,可以通过元素value找到相应的score值。(2)跳跃表:跳跃表的目的在于给元素value排序,根据score的范围获取元素列表,用于快速的查找到目标元素。
7、Redis位操作(Bitmaps)
7.1、基本介绍
本身不是一种数据类型,实际上就是字符串,但可以对字符串进行位操作,其中以0和1进行存储。可以想象成一个以位为单位的数组,数组下标叫偏移量。
7.2、常用操作
setbit <key> <offset> <value>:设置Bitmaps中某个偏移量的值
getbit <key> <offset>:获取Bitmaps中某个偏移量的值
bitcount <key> [start end]:返回从start到end中位为1的数量
bitop and(or/not/xor) <newmap> <bitmap1> <bitmap2>:
8、基数(HyperLogLog)
8.1、基本介绍
用于做基数统计的算法,每个HyperLogLog键只需要花费12KB内存就可计算接近2^64个不同元素的的基数。基数为不重复元素、如数据集{1,3,5,7,5,7,8},基数集为{1,3,5,7,8},基数为5。
8.2、常用操作
pfadd <key> <value1> <value2>:向HLL中加入值
pfcount <key1> <key2>:计算HLL的近似基数,可以计算多个HLL,返回合并后的结果
pfmerge <newkey> <key1> <key2>:
9、Redis经纬度(Geospatial)
9.1、基本介绍
Redis 3.2中增加了对GEO类型的支持。GEO ,Geographic,地理信息的缩写。该类型,就是元素的⒉维坐标,在地图上就是经纬度。redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作。
9.2、常用操作
geoadd <key> <longitude> <latitude> <value>:
geopos <key> <value>:根据名称取坐标位置
geodist <key> <value1> <value2> [m|km|ft|mi]:
georadius <key> <longitude> <latitude> radius m|km|ft|mi:
关注微信公众号:夜寒信息
致力于为每一位用户免费提供更优质技术帮助与资源供给,感谢支持!