【Redis Study】

本文介绍了Redis中字符串类型的数据操作,包括常用命令如设置、获取、删除及自增减等,并探讨了内部编码机制,如int、embstr和raw。此外,还提供了使用建议,如键命名规范,并列举了缓存、计数和限速等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本章开始介绍redis的使用

某次无意中发现著名的非结构数据库 redis的代码竟然只有2万行左右(排掉近些年加的集群部分),打出来的包只有4,5M,这样轻量就可以提供如此丰富且安全可靠的功能,真的是震惊到我了,我下决心好好来研究研究他,本文主要是对学习redis过程的心得体会和一些记录(初学真的觉得redis的命令太多了,而且有点不按套路来,有点混乱?),主要是对各种书籍的拜读和记录。
本篇主要是对书籍 《Redis开发与运维》的第二章 2.2节字符串部分的记录摘抄,也是用来做备忘查阅用

1 overview

字符串类型的值可以是字符串、数字、二进制,最大不超过512MB

2 命令

2.1 常用命令

2.1.1 设置值

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

描述命令例子成功返回失败返回时间复杂度
设置kvset key valueset hello worldOKO(1)
设置有期限的kv 单位:秒set key value ex secondsset hello world ex 10OK(nil)O(1)
设置有期限的kv 单位:秒setex key seconds valuesetex hello 10 worldOK(nil)O(1)
键不存在的时候才能设置成功set key value nxset hello world nxOK(nil)O(1)
键不存在的时候才能设置成功setnx key valuesetnx hello world(integer)1(integer)0O(1)
键存在的时候才能设置成功set key value xxset hello world xxOK(nil)O(1)
批量设置值mset key1 value1 key2 value2 …set java jedis python redis-py …OK(nil)O(k), k是设置的键个数
2.1.2 获取值

get key

描述命令例子成功返回失败返回时间复杂度
根据键获取值get keyget helloworld(nil)O(1)
批量获取值mget key1 key2 …mget java python1) ” jedis”
2) “redis-py”
(nil)O(k), k是获取的键个数

!!! 批量操作可以有效的减少网络时间

get * n: n次get耗时 = n次网络时间 + n次命令时间

mget: n次get耗时 = 1次网络时间 + n次命令时间

2.1.3 其他
描述命令例子结果时间复杂度
键是否存在exists keyexists hello存在:(integer)1
不存在:(integer)0
删除键值,支持批量del key1 key2 key3del hello存在:(integer)1
不存在:(integer)0
O(k), k是删除的键个数
key自增incr keyincr hellovalue是整数:自增后结果
value不是整数:(error) ERR value is not an integer or out of range
value不存在:1,并创建该键值
O(1)
key自增指定值incrby key incrementincrby hello 10value是整数: 自增10后结果
value不是整数:报错
value不存在:10,并创建该键值
O(1)
key自增浮点值incrbyfloat key incrementincrbyfloat hello 0.5value是数值型:自增0.5后结果
value不是数值型:报错
value不存在:0.5,并创建该键值
O(1)
key自减decr keydecr hellovalue是整数:自减后结果
value不是整数:(error) ERR unknown command decy, with args beginning with: intkey,
value不存在:-1,并创建该键值
O(1)
key自减指定值decrby key decrementdecr hello 10value是整数:自减10后结果
value不是整数:(error) ERR value is not an integer or out of range
value不存在:-10,并创建该键值
O(1)

2.2 不常用命令

描述命令例子结果时间复杂度
追加值append key valueappend hello world“worldworld”O(1)
字符串长度(中文占用3个字节)strlen keystrlen hello(integer)10O(1)
设置并返回原值getset key valuegetset hello redis“worldworld”
设置指定位置的字符setrange key offset valuesetrange hello 0 b“bedis”O(1)
获取部分字符串getrange key start endgetrange hello 0 2“bed”O(n),n是字符串长度

3 内部编码

redis内部每种存储类型都基本上有多种不同的内部编码来适应不同的情况,如更快存取和更节省内存

我们使用如下命令来检查key的内部编码。
object encoding key

3.1 int

8个字节的长整型

127.0.0.1> set key 8653
OK
127.0.0.1> object encoding key
"int"

3.2 embstr

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

127.0.0.1> set key "hello, world"
OK
127.0.0.1>  object encoding key
"embstr"

3.3 raw

大于39个字节的字符串

127.0.0.1> set key "abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()_+-={}[];<>,./?"
OK
127.0.0.1> object encoding key
"raw"

redis会根据值的类型和长度来自行决定使用哪种内部编码

4 使用建议

redis 没有明确对顶键的声明方式,所以如果在开发中不注意规范将会导致在使用的时候非常的混乱,因此建议一定要有统一的规范,如果公司有规范就按照规范来,否则可以使用如下规则或建立自己的规范:

业务名:对象名:id:[属性] 的组合作为键

e.g.: vs:user:1

5 使用场景

  1. 缓存功能:MySQL最典型也应该是使用最多的场景
  2. 计数:常见如视频播放数,博客阅览数自增
  3. 共享session:分布式web服务将用户的session信息放到redis中进行集中管理
  4. 限速: 如限制用户一分钟内收取验证码的次数

6 插图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值