第二章 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 raw,int,embstr

      Hash hashtable,ziplist

Key     List linkedlist,ziplist

      Set hashtable,intset

      Zset skiplist,ziplist

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

2.1.3单线程架构

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

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

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

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

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

第二,非阻塞I/O,Redis使用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内部编码

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

Int:8个字节的长整形

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={

{field,value} {field,value} {field,value}...}

2.3.1命令

设置值 hset key field value

获取值 hget key field

删除field: hdel field [field...]

计算个数:hlen key

批量操作:

Hmget key field

Hmset key value[field value,field value]

是否存在:hexists key field

获取所有的field:hkeys key

获取所有的value:hvals key

获取所有的field-value:hgetall 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去模拟关系型复杂查询开发难度高维护成本高

原文地址:https://www.cnblogs.com/cuijl/p/8946164.html

时间: 2024-10-30 07:11:45

第二章 API的理解和使用的相关文章

sed && awk 第二章runsed代码理解

#! /bin/sh 2 for x 3 do 4 echo "editing $x: \c" 5 # if test "$x"=sedscr; then 6 # echo "not editing sedscript!" 7 if [ "$x" = "sedscr" ];then 8 echo "bi not editing sedscript!" 9 elif test -s $x;

疯狂Android第二章:Adapter以及部分控件使用

第二章 重点:1.理解View以及各种布局的优缺点,适用场景. 2.熟练掌握adapter原理与用法. 3.熟悉其它控件的基本使用方法. ////////////////////////////////////////// 1.动态创建与加载View. 2.开发自定义View,由于Android提供的控件类型有限,对于一些应用来说是无法满足的,例如地图的显示,Android并没有提供一个可以显示地图界面的view组件,这时就需要开发者自行的构造一个满足自己需求的view组件,通常view基类是一

[原创译书] JS函数式编程 第二章总结

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 函数式程序员的工具集 第二章总结 为了理解函数式编程,这章覆盖了很大范围的主题.首先我们分析了一个编程语言的函数式是什么意思, 并且评估了Javascript函数式编程能力.接下来,我们用Javascript实现了一些函数式编程的核心概念, 并展示了一些Javascript内建的函数式编程函数. 尽管Javascript有一些函数式编程的工具,它函数式编程核心的大部分仍被隐藏着,并

《深入理解Java虚拟机》读书笔记---第二章 Java内存区域与内存溢出异常

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来.这一章就是给大家介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产生的问题. 1.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 1.1程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型中里,字

网页音频API 第二章

第二章 完美的时间模型和时延网页音频API比<audio>标签更强大的一处在于它有一个低延迟.精准的时间模型.对于游戏和交互式应用来说,低延迟是非常重要的,因为你通常需要非常快的用声音来响应用户操作.如果这个反馈不是即时的,用户会感觉到这个延迟,这是不让人满意的.实际上,由于人类听觉的缺陷,延迟的误差可高达20毫秒,不过这个数字还会随着很多其他的因素来改变.精准的时间模型使你能够把事件安排在未来特定的时间.这对用脚本控制(播放)的场景和音乐应用来说非常有用. 时间模型音频上下文的一个关键点在于

【深入理解Linux内核】《第二章 内存寻址》笔记 (2014-06-28 12:38)

2.1 内存地址 逻辑地址:段+偏移 线性地址(虚拟地址) 物理地址 2.2硬件中的分段 2.2.1 段选择符和段寄存器 15                                                3  2  1   0 ------------------------------------------------|                                                    |TI |RPL  ||         索引号 

CSAPP深入理解计算机系统第二章荟萃

1.可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位.计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息. 2.在C语言中的条件语句,以及三目的条件运算符,都可以用移位的方式来做. 3.在进行位扩展操作的时候,比较讲一个32位的有符号数扩展到64位,那么在保证原来的值不变的情况下,把31个低位扩展到64位的低位上,而最高的符号位扩展到高33位上. 4.利用位模式仅仅只能表示一些2的n次幂的一些浮点数,其他的比较特殊的有理数,会近似

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

深入理解计算机系统 第二章 信息的表示和处理

欣哥划重点: @所有人, 第二章比较难,我建议至少掌握下面几个知识点: 1. 字节顺序 : 大端和小端 2. 运行 图2-24, 图2-25程序 show-bytes.c 观察结果,看看有什么问题 3. 理解布尔运算,位运算 4. 理解无符号数和有符号数, 给一个数,能计算出补码 5. 理解浮点数的表示法,给一个十进制小数,能转换成二进制的浮点数表示 原文地址:https://www.cnblogs.com/stone94/p/9824395.html