第二章 API的理解和使用

2.1.1全局命令

Key * 查看所有键,(慎用,会把所有键都遍历一次并列出)

Dbsize 查看键总数,不会遍历所有键,只是从内置函数中读取一个数

Exists [key] 检查键是否存在

Del [key] 删除键

Expire [key] [seconds] 设置键过期时间

Type [key] 键的数据结构类型

2.1.2数据结构和内部编码

Type命令实际返回的就是当前键的数据结构类型:string字符串,hash哈希,list列表,set集合,zset有序集合,但这些只是redis对外的数据结构,

 

 

实际上每种数据结构都有自己底层的内部编码实现,而且试多种实现,这样redis会在合适的场景选择合适的内部编码

      String rawintembstr

      Hash hashtableziplist

Key     List linkedlistziplist

      Set hashtableintset

      Zset skiplistziplist

可以通过object encoding命令查询内部编码。这样的设计可以适应不同业务场景

2.1.3单线程架构

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。

客户端与服务端的模型可以简化为:发送命令,执行命令,返回结果三步。

其中第二步因为redis是单线程来处理命令的,所以一条命令从客户端到达服务端不会立刻被执行,所有命令都会进入一个队列中,然后逐个被执行。这样可以避免并发的问题。

为什么单线程还能这么快?

第一,纯内存访问,redis将所有数据放在内存中,内存的响应时长大约在100纳秒,这是redis达到每秒万级别访问的重要基础。

第二,非阻塞I/ORedis使用epoll作为io多路复用技术的实现,再加上redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为事件,不在网络io上浪费过多的时间

单线程避免了线程切换和竟态产生的消耗。

2.2字符串

是最基础的数据类型,其它几种数据类型也是在字符串的基础上构建的;实际上字符串类型的值还可以是:字符串,数字,二进制,但值不能超过512MB

2.2.1命令

设置值

Set key value [ex seconds] [px milliseconds] [nx|xx]

Ex seconds:设置秒级过期时间

px milliseconds:设置毫秒级过期时间

Nx 键必须不存在,才可以设置成功,用于添加

Xx:与nx相反,键必须存在,才可以设置成功,用于更新

获取值

  Get key

批量设置值:

  Mset key value [key value key value]

批量获取

  Mget key [key key key]

计数

  Incr key

命令用于对值进行自增操作,返回结果又3种:

 

值不是整数,返回错误

值是整数,返回自增后结果

键不存在,按照值为0自增,返回结果为1

 

相关的还提供了decr自减,incrby自增指定数字,decrby自减指定数字,incrbyfloat自增浮点型

追加命令

  Append key value

value的尾部追加值

字符串长度:

  strlen key

设置并返回原值

  Getset key value

设置指定位置的字符

  Setrange key offeset value

获取部分字符串

  Getrange key start end

2.2.2内部编码

字符串类型有三种内部编码:

Int8个字节的长整形

Embstr:小于等于39个字节的字符串

Raw:大于39个字节的字符串

Redis会根据当前值的类型和长度决定使用那种内部编码

2.2.3使用场景

缓存功能

使用redis作为系统的缓存层关系型数据库作为数据层。Reids具有支撑高并发的特性,所以缓存通常能起到加速读写和降低后端压力的作用。

 

UserInfo getUserInfo(long id){

1,检查redis种是否存在用户信息

2,redis种获取session信息

3,如果没有则序列化到redis

}

 

计数

许多应用都会使用redis实现计数功能

共享session

一个分布式web服务将用户的session信息保存再各个服务器中,这会造成一个问题:出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同的服务器上,用户刷新一次会造成重复登陆的现象。为了解决这个问题,可以使用redis将用户的session进行集中管理,每次用户更新或者查询登陆信息都直接从reids种获取信息

限数

很多应用出于安全考虑,会再每次进行登陆时,让用户输入验证码,但为了短信接口不被频繁访问会限制用户每分钟获取验证码的频率,例如一分钟不能超过5次。

2.3哈希

哈希类型是指键值本身又是一个键值结构。

Key - value={

{fieldvalue} {fieldvalue} {fieldvalue}...}

2.3.1命令

设置值 hset key field value

获取值 hget key field

删除fieldhdel field [field...]

计算个数:hlen key

批量操作:

Hmget key field

Hmset key value[field value,field value]

是否存在:hexists key field

获取所有的fieldhkeys key

获取所有的valuehvals key

获取所有的field-valuehgetall key

计算value的字符串长度:hstrleng key value

2.3.2内部编码

Ziplist压缩列表:当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512),同时所有值都小于hash-max-ziplist-value配置(默认配置64字节)时,redis会使用ziplist作为内部实现

Hashtable哈希表:当不满足压缩列表时自动升级为哈希表,hashtable的读写时间复杂度O(1)

2.3.3使用场景

可以将关系型数据库表记录的数据(user)通过userID缓存到redis中。

比如将整个用户的关联信息通过json缓存到field

需要注意两点哈希类型是稀疏的,而关系型数据库是完全结构化的。

关系型数据库可以做复杂的关系查询,而reids去模拟关系型复杂查询开发难度高维护成本高

2.4列表

列表用力啊存储多个有序的字符串,如图由五个元素组成的列表,列表中的每个字符串成为元素,一个列表最多存232次方-1个元素。

redis中,可以对列表两端进行插入和弹出,还可以获取指定范围的元素列表,获取指定索引下表的元素。列表是一种比较灵活的数据结构,可以充当栈和队列的角色,再实际开发中由很多的应用场景。

  列表有两个特点:一.列表中的元素是有序的;二.列表中的元素可以重复。

2.4.1命令

添加命令:lpushrpushlinsert

查看: lrangelindexllen

删除: lpoprpoplremltrim

修改: lset

阻塞操作:blpopbrpop

从右边插入元素:rpush key value [value1 value2 value3...]

Rpush listkey a b c d e

 

从左到右查看元素lrange listkey 0 -1

 

向某个元素前后插入元素:linsert key before|after prvot value

Linsert listkey before b net

查找

获取指定范围内的元素列表

lrange key start end

lrange操作会获取列表指定索引范围所有的元素。索引下标有两个特点:

第一,索引下标从左到右分别是0N-1,但从右到左分别是-1-N

第二,lrange中的end选项包含了自身。Eg:想获取列表的第2到第4个元素

获取列表指定索引下标的元素 lindex key index

  Eg:获取当前列表最后一个元素a

 

lindex listkey -1

获取当前列表长度llen key

删除

从列表左侧弹出元素

 

删除指定元素lrem key count value

Lrem命令会从列表中找到等于vlaue元素进行删除,根据count的不同分为三种情况:

Count>0:从左到右,删除最多count个元素

Count<0:从右到左,删除最多count绝对值个元素

Count=0:删除所有。

例如先向列表中插入4a,然后删除列表a左侧的4个元素

 

按索引范围修剪列表元素ltrim key start end

 

修改,修改指定索引下标的元素:lset key index newValue

2.4.2内部编码

列表类型的内部编码右两种。

Ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512),同时列表种每个元素的值都小于list-max-ziplist-value配置时(默认64字节),redis会选用ziplist来作为列表的内部实现来减少内存的使用。

Linkedlist(链表)

2.4.3使用场景

消息队列

文章列表:每个用户右属于自己的文章列表,需要分页展示文章列表。此时可以考虑使用列表。因为列表不但时有序的,而且支持按索引范围获取元素。(文章内容可以使用hash结构来存储)

2.5集合

集合类型也是用来保存多个字符串元素,但和列表类型不一样的是集合中不可以有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集/并集/差集

2.5.1命令

添加元素:sadd key element [ele ele ele]

删除元素:srem key element [ele ele ele]

计算元素个数:scard key  他不会遍历整个集合而是取内部变量

判断元素是否在集合中:siselember key element

随机从集合返回指定个数元素 srandmember key [count]

从集合中随机弹出元素:spop key

获取所有集合元素:smembers key

集合间操作

求多个集合的交集:sinter key [key key...]

求多个集合的并集:sunion key [key key...]

求多个集合的差集:sdiff key  [key key...]

将交集,并集,差集的结果保存

sinterstore destination key  [key key...]

如上

2.5.2内部编码

Intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512)时,redis会选用intset来作为集合的内部实现,从而减少内存使用。

Hashtable:当集合类型无法满足intset的条件时,使用hashtable作为它的内部实现。

2.5.3使用场景

  用户标签,一个用户可能有很多的兴趣爱好。

2.6有序集合

有序集合保留了集合不能有重复成员的特性,但不同的时,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的时,它给每个元素设置一个分数作为排序的依据。注意,元素不能重复但是score可以重复

2.6.2内部编码

Ziplist(压缩列表):当有序集合元素个数小于zset-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,redis会用ziplist来作为有序集合的内部实现。

Skiplist(跳跃表)

2.6.3使用场景

排行榜系统。

2.7键管理

2.7.1单个键管理

键重命名: rename key newkey

如果在rename之前,键已经存在,那么它的值也将被覆盖。为了防止被强行renameredis提供了renamenx命令,确保只有newkey不存在时才被覆盖。注意:

由于重命名键期间会执行del命令删除旧键,如果键对应的值比较大,会存在阻塞的可能性

如果renamerenamenx中的keynewkey如果是相同的,在3.2版本中时可以的,在3.2以前会报错。

随机返回一个键:randomkey

2.7.2遍历键

Keys [pattern]替代pattern* ? [] \x

Keys * 获取所有的键

* 代表所有

? 代表匹配一个字符

[] 代表匹配部分字符

\x 用来做转义;比如要匹配星号则需要转义

Keys是会造成阻塞所以一般不建议在生产环境上使用

渐进式遍历

2.8版本后,提供了一个新的命令scan,它通过渐进式遍历的方式解决keys在遍历是带来的阻塞问题。每次scan命令的时间复杂的是O1)。但要真正实现keys的功能,需要执行多次scan

每次执行scan,可以想象成扫描了一个字段中的一部分键,直到将字典中的所有键遍历完毕。使用方法:Scan cursor [match pattern] [count number]

Cursor是必须参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0标识遍历结束。

Match pattern是可选参数,它的作用类似与模式匹配,这点和keys的模式匹配很想。

Count number是可选参数,它的作用是表名每次遍历键的个数默认值是10,可以适当增大。

Scan虽然有效的解决了keys命令可能产生的阻塞问题,但scan并非完美 ,如果在scan的过程中如果有键发生了变化(增删改),那么便利的效果可能会碰到新增的键没有被查到,遍历出的键重复了等情况。

也就是说scan并不能完整的遍历出所有的键。

转载于:https://www.cnblogs.com/cuijl/p/8946164.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java uuid 线程安全_java – 在多线程应用程序中生成相同的UUID

我使用UUID.randomUUID().toString()将一个唯一值附加到最终存储在数据库中的字符串,并对其具有唯一约束但是因为我的应用程序是多线程的,所以执行在UUID生成的同时发生,并且最终将相同的UUID附加到字符串并且持久性失败.有没有更好的方法来生成随机字符串,即故障安全方法.我尝…

社会生活、工作中的著名法则

社会生活中的著名法则(1)&#xff1a;马太效应 《新约 马太福音》中有这样一个故事&#xff0c;一个国王远行前&#xff0c;交给三个仆人每人一锭银子&#xff0c;吩咐他们&#xff1a;“你们去做生意&#xff0c;等我回来时&#xff0c;再来见我。”国王回来时&#xff0c;第一…

Django中--使用redis存储历史浏览记录

class UserInfoView(LoginRequiredMixin, View):用户中心-信息页def get(self, request):显示# Django会给request对象添加一个属性request.user# 如果用户未登录->user是AnonymousUser类的一个实例对象# 如果用户登录->user是User类的一个实例对象# request.user.is_aut…

3D虚拟试衣有望解决厘米级服装误差 网购服装不再蒙

还在担心网购服装对实际穿着效果没把握吗&#xff1f;随着京东App 6.6.3版本的更新&#xff0c;京东试试3D虚拟试衣功能正式上线&#xff0c;消费者可按照自己的身材比例创建专属的3D模型&#xff0c;而试穿效果则可以完全依照模型来展现。据了解&#xff0c;这个系统未来还将实…

关于idea修改当前使用的git账户的问题

1、问题描述&#xff1a; 由于前一段时间公司迁移git&#xff0c;就是将项目代码等迁移到另一个git服务器上&#xff0c;结果用idea从git上clone代码的时候发现没有指定仓库,如下提提示 2、排查原因&#xff1a; 开始怀疑是没有把自己加入到项目成员里面&#xff0c;经过检查是…

分页和分段的区别

1.页是信息的物理单位&#xff0c;分页是由于系统管理的需要。段是信息的逻辑单位&#xff0c;分段是为了满足用户的要求。 2.页的大小固定且由系统决定&#xff0c;段的长度不固定&#xff0c;决定于用户所编写的程序&#xff0c;通常由编译程序在对源程序紧进行编译 时&…

java 修饰_Java 修饰符

摘录自http://www.runoob.com/java/java-modifier-types.htmlJava 修饰符Java语言提供了很多修饰符&#xff0c;主要分为以下两类&#xff1a;访问修饰符非访问修饰符修饰符用来定义类、方法或者变量&#xff0c;通常放在语句的最前端。我们通过下面的例子来说明&#xff1a;pu…

内存分配,任意字节对齐

有这么一道题目&#xff0c;要求按任意字节对齐分配内存&#xff0c;接口&#xff1a;char * aligned_malloc(int size, int alignment)//size 为分配的内存大小&#xff0c;alignment对齐基数&#xff08;可以为任意数&#xff09;这个在gcc库函数里能找到源码&#xff0c;在f…

day16-Dom提交表单以及其他

一、前言 之前我们学习的是from提交表单&#xff0c;那个是html的提交表单方式&#xff0c;现在我们用dom来提交表单&#xff0c;还有一些其他的方式 二、dom提交表单 2.1、html提交表单 说明&#xff1a;form标签跟submit类型的input标签结合 <body><form id"f1…

分布式文件系统FastDFS

1. 什么是FastDFS FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制&#xff0c; 充分考虑了冗余备份、负载均衡、线性扩容等机制&#xff0c;并注重高可用、高性能等指标&#xff0c;使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件…

html5 下拉刷新(pc+移动网页源码)

本文demo下载地址&#xff1a;http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1071 本文实现在html5网页中使用下拉功能自动刷新显示更多内容, 使用jquery捕捉和处理相应的鼠标事件, 例如内容在顶部时&#xff0c;触发下拉事件后显示更多内容; 如内容在…

操作系统内存管理问题集锦

1. 可采用哪几种方式将程序装入内存?它们分别适用于何种场合? a. 首先由编译程序将用户源代码编译成若干目标模块&#xff0c;再由链接程序将编译后形成的目标模块和所需的-库函数链接在一起&#xff0c;组成一个装入模块&#xff0c;再由装入程序将装入模块装入内存&#x…

java同名变量在list中添加两次_快速解决List集合add元素,添加多个对象出现重复的问题...

首先我们在new 一个对象的时候&#xff0c;对象的id是唯一确定的&#xff1b;将对象add入list中时&#xff0c;放入list中的其实是对象的引用 &#xff1b;而每次循环只是简单的set 对象的属性&#xff0c;set新的属性值&#xff0c;而add进list中的对象还是同一个对象id&#…

python面试题总结(1)--语言特性

1. 谈谈对 Python 和其他语言的区别 答&#xff1a; Python 是一门强类型的可移植、可扩展、可嵌入的解释型编程语言&#xff0c;属于动态语言&#xff1b;其语法简洁优美、功能强大无比、应用领域非常广泛且具有强大完备的第三方库。 &#xff08;注&#xff1a;语言有无类型…

视频网站盈利模式与营销策划

在与数十家视频网站进行信息网络传播权交易过程中&#xff0c;在研究视频网站内容和盈利模式基础上&#xff0c;综合自己在传统媒体和新媒体领域十几年的策划和营销经验&#xff0c;我发现&#xff1a;视频网站的盈利模式其实早就形成多种体系&#xff0c;但是盈利之路艰难&…

USACO 06JAN 牛的舞会 洛谷2863

题目描述 The N (2 < N < 10,000) cows are so excited: it’s prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the Round…

[UWP]了解模板化控件(4):TemplatePart

原文:[UWP]了解模板化控件(4)&#xff1a;TemplatePart1. TemplatePart TemplatePart&#xff08;部件&#xff09;是指ControlTemplate中的命名元素。控件逻辑预期这些部分存在于ControlTemplate中&#xff0c;并且使用protected DependencyObject GetTemplateChild(String ch…

动态重定位的增加的紧凑功能

动态重定位增加了紧凑的功能&#xff0c;在动态的分区分配时&#xff0c;可以对外部碎片进行紧凑来为没有内存空间进行存储的进程进行分配。

java 重载 equals_实现Student类的equals重载函数

[java]代码库//测试类public class StudentDemo {public static void main(String[] args) {Student s1 new Student("000","张三",18);Student s2 new Student("000","张三",18);//随便改boolean flag s1.equals(s2);System.out.p…

python面试题总结(2)--编码规范

1. 什么是 PEP8? 答&#xff1a;PEP8 --《Python Enhancement Proposal #8》&#xff08;8 号 Python 增强提案&#xff09;&#xff0c;他针对的 Python 代码格式而编订的风格指南。 2. 了解 Python 之禅么&#xff1f; 答&#xff1a;通过 import this 语句可以获取其具体…