Redis ——(2) 全局命令、数据结构和内部编码、字符串及其应用场景

本文介绍了Redis中的全局命令,如keys、dbsize、exists等,探讨了数据结构(如string、hash、list等)及其内部编码优化,解释了Redis为何能实现单线程高性能,并详细解析了字符串类型,包括常用命令、内部编码(int、embstr、raw)及在缓存、计数、共享session和限速等场景的应用。
摘要由CSDN通过智能技术生成

Redis学习笔记 ——(2)全局命令、数据结构和内部编码、字符串及其应用场景

1. 全局命令

首先了解一下redis常用的全局指令。

  • keys *
    查看存在的所有键,可以先通过set方法设置几个key,然后通过keys * 就可以看到当前所有的key。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set name zhangshan
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> keys *
1) "name"
2) "hello"
  • dbsize
    键总数,可以看懂啊当前存在多少键。
127.0.0.1:6379> dbsize
(integer) 2
  • exists key
    查看键是否存在,如果键存在咋返回1,不存在则返回0.
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists h
(integer) 0
  • dele key []
    删除键
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> exists hello
(integer) 0
  • expore key seconds
    给键添加过期时间,当超过设定的时间之后,会自动删除该键。
  • type key
    查看键的数据结构类型
127.0.0.1:6379> set string_key "string_key_value"
OK
127.0.0.1:6379> type string_key
string

2. 数据结构和内部编码

全局命令中的type返回的就是当前键的数据结构类型,他们分别是string(字符串)、hash(哈希)、list(字列表)、set(集合)、zset(有序集合),但这些只是redis对外的数据结构。

在这里插入图片描述

127.0.0.1:6379> get hello
"stirng"
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> set hellos 123
OK
127.0.0.1:6379> object encoding hellos
"int"

可以看到hello对应的值的内部编码是embstr, 而hello对应的内部编码格式为int。

Redis这样设计有两个好处:
第一可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发出更优秀的内部编码,无需改动外部数据结构狗和命令,例如Redis3.2提供了quicklist,结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现,而对外部用户基本感知不到。
第二是多种内部编码实现可以再不同场景下发挥各自的优势,例如ziplist比较节省内存,但是再列表元素比较多的情况下,性能有可能会有所下降,这种时候redis会根据配置选项将这些列表类型的内部实现转换为linkedlist。

3.单线程架构

交互模型

Redis客户端于服务端请求的过程分为三步:
1.客户端发送命令到服务端
2.服务端执行命令
3.服务端返回结果

为什么单线程还能这么快

通常来说,单线程处理能力要比多线程查,例如有10000斤的货物,每辆车的运载能力是200斤,就要运50次,但是如果有50辆车,一次就可以完成,而redis可的单线程模型可以达到每秒万级别的处理能力的有以下三点。

  • 纯内存访问,Redis将所有的数据都放在内存中,内存的相应时长大约位100纳秒,这是Redis达到每秒万级别访问的重要基础。
  • 非阻塞I/O,Redis使用epol作为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不再网络I/O上浪费过多的时间。
  • 单线程避免了县城切换和静争产生的消耗。

1.字符串

字符串类型是redis嘴基础的数据结构,首先键都是字符串类型,而其他几种数据结构都是在字符串基础上构建的。
字符串类型的值实际上可以是字符串、数字、二进制等,但是最大不能超过521MB。

常用的命令
1	SET key value
设置指定 key 的值。
2	GET key
获取指定 key 的值。
3	GETRANGE key start end
返回 key 中字符串值的子字符
4	GETSET key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
5	GETBIT key offset
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
6	MGET key1 [key2..]
获取所有(一个或多个)给定 key 的值。
7	SETBIT key offset value
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8	SETEX key seconds value
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
9	SETNX key value
只有在 key 不存在时设置 key 的值。
10	SETRANGE key offset value
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11	STRLEN key
返回 key 所储存的字符串值的长度。
12	MSET key value [key value ...]
同时设置一个或多个 key-value 对。
13	MSETNX key value [key value ...]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14	PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
15	INCR key
将 key 中储存的数字值增一。
16	INCRBY key increment
将 key 所储存的值加上给定的增量值(increment) 。
17	INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment) 。
18	DECR key
将 key 中储存的数字值减一。
19	DECRBY key decrement
key 所储存的值减去给定的减量值(decrement) 。
20	APPEND key value
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。 
内部编码

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

  • int :8个 字节的长整型
  • embstr: 小鱼等于38个字节的字符串
  • raw: 大于39个字节的字符串
    redis会根据当前值的类型和长度决定使用哪种内部编码实现。
应用场景
  • 缓存功能
    系统架构的设计当中,通常会在web服务和存储层之间加一个存储层,当用户查询一次信息之后就将信息放在缓存区,当用户再次进行访问的时候,会优先再缓存层去查询,如果没有存在则去存储层查询并增加到缓存层,这样可以大大的减轻存储层的压力。
  • 计数
    许多应用会使用Redis作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同事数据可以异步落地到其他数据源。
    -共享session
    一个分布式web服务如果将所有的用户登录状态信息存储在服务器中,会导致数据量较大,响应速度慢等问题,Redis可以将用户的session进行集中管理,每次用户更新活着查询登录信息都直接从Redis中集中获取。
    - 限速
    很多应用出于安全的考虑,在每次登陆前需要输入验证码,但是为了短信接口不被频繁的访问,可以限制用户每分钟获取验证码的频率,例如一分钟只能1次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值