redis 简单整理——redis 的字符串基本结构和命令[二]
前言
简单介绍一下redis的基本结构和命令。
正文
redis有5种基本结构:
字符串
哈希
列表
集合
有序集合
那么就来看下其基本命令吧。
通用命令键:
keys * 查看全部键,一般不怎么用。
dbsize 查看有多少键
dbsize 效率比较高,直接读取的redis内部缓存的值。
exits key 查看是否存在该键。
del key 删除某个键。
设置键过期 expire key seconds
ttl 查看键过期时间
ttl 有3种返回值:
大于0或者等于0 为键的过期时间
-1 键没有设置过期时间
-2 键不存在
- type 查看键的类型
前面提及到了数据结构。
但是数据结构也有内部编码这个东西。
举个例子,比如说list 数据结构,有两种数据编码 linkedlist 和 ziplist 两种内部编码。
那么如何来查看数据编码呢?
可以通过object encoding testlist 来查看
内部编码:
那么内部编码有什么作用呢?
内部编码只是针对redis 内部的,对外部基本无感。
每种内部编码适合不同的场景,比如说ziplist比较节约内存,linkedlist 性能好一些,可以针对不同的需求,做不同的事情。
然后来谈论一下为什么redis是单线程的原因。
很多时候我们会说多线程的利用率更高,这是针对多核的情况。
而我们现在基本上都是多核,那么为什么是单线程呢?
因为redis的优势在于热数据,什么是热数据呢? 就是操作比较频繁。
那么对于多线程来说,操作频繁是要加锁的,这里面的机制比较消耗性能。
其二,虽然redis是单线程,但是也可以利用io 多路复用技术来解决io问题。
随之而来的单线程的遇到的问题是什么呢? 也是可以马上想到的问题,既然是单线程,那么执行时间应该是比较看重的,如果一个命令执行时间过长,那么是非常致命的。
那么下面就来了解一下数据结构的一些基本知识吧。
- 字符串
字符串说是字符串,但是实际上可以是(json,xml),甚至是二进制(图片、音频、视频)。
当然值也是有限制的,不能超过512mb,一般来说是不会操作的,这种形式都成大文件了。
一些常用命令:
- set hellow world
设置
看到那行有点隐形的字了吗?set key value(ex seconds | px milliseconds )[ nx|xx]
这些是命令提示。
ex 表示过期时间为秒级。
px 表示过期时间为毫秒级。
nx 表示键必须不存在才可以设置成功,用于添加。这个还是比较重要的。
当然也可以这样,setnx hello word2。
这样如果有值的话不能添加。
xx 表示有值的时候才能成功,表示只能用于更新。
也可以使用setxx这样。
setnx 可以为是分布式锁实现的一种方式。https://redis.io/topics/distlock。
当然设置值的方式也可以使用mset。
mset a b c d e f
- get 获取
当然也可以使用mget:
使用mget,可以大大节约网络时间。
虽然redis的读写能力非常高,但是网络可能会成为其中的一个瓶颈,那么使用mget来说还是可以的。然后实际上mget,也是执行多次命令,而不是一个命令。
上图可以看到,其命令数其实是一样的,网络时间大大减少。
- 字符串模式的其他功能,计数
incr,取自increase,这个单词。
incr 有几个返回结果:
值不是整数,返回错误。
值是证书,返回自增后的结果。
键不存在,按照值0自增,返回结果为1,这个东西还是很方便的,我们不需要判断这个值是否存在,减少了我们的逻辑代码。
除了自增命令,还有decr 自减,increby 自增指定数字,decreby自减指定数字,incrbyfloat 自增浮点数
不常用命令:
- 追加值
append key value
- 字符串的长度
- 设置并返回原值
将hello 设置为了workd,然后返回了原先的值。
- 设置指定位置字符
setrang key offset value
基本没人用。
- 获取部分字符
getrang key start end
上面的整理表。
内部编码
字符串类型的内部编码有3中:
int 8个字节的长整型
embstr 小于等于39个字节的字符串
row 大于39个字节的字符串
redis 会根据当前的值类型和长度决定用哪种内部编码实现。
使用场景
- 缓存从redis中获取用户信息
开发提示
- 计数
实际上一个真实的计数系统要考虑的问题会很多:防作弊、按照不同维 度计数,数据持久化到底层数据源等
- 共享session
虽然有些人说这不就是缓存吗?但是其功能主要是共享,所以还是把其定义为共享比较好。
一个分布式Web服务将用户的Session信息(例如用户登 录信息)保存在各自服务器中,这样会造成一个问题,出于负载均衡的考 90
虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可 能会发现需要重新登录,这个问题是用户无法容忍的。
为了解决这个问题,可以使用Redis将用户的Session进行集中管理,如 图2-12所示,在这种模式下只要保证Redis是高可用和扩展性的,每次用户 更新或者查询登录信息都直接从Redis中集中获取
- 限速
很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证 码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用 户每分钟获取验证码的频率,例如一分钟不能超过5次.
结
下一节,hash值。
redis 简单整理——redis 的字符串基本结构和命令[二]的更多相关文章
- bash shell笔记3 结构化命令二
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/513601 三 ...
- 一篇文章带你了解NoSql数据库——Redis简单入门
一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...
- Redis简单介绍
redis简单介绍 Redis VS key-value缓存产品 Redis支持数据的持久化,能够将内存中的数据保持在磁盘中,重新启动的时候能够再次载入进行使用. Redis不只支持简单的key-va ...
- 面试简单整理之Redis
179.redis 是什么?都有哪些使用场景? Redis是一个key-value存储系统. 缓存,消息队列,排行榜/计数器,分布式架构,做session共享 180.redis 有哪些功能? 181 ...
- Redis—简单动态字符串(SDS)
目录 Redis-简单动态字符串(SDS) SDS的定义 SDS与C字符串的区别 1. 常数复杂度获取字符串长度: 2. 杜绝缓冲区溢出: 3. 减少修改字符串时带来的内存重分配次数 4. 二进制安全 ...
- springboot整合redis(简单整理)
Redis安装与开启 我这里是在windows上练习,所以这里的安装是指在windows上的安装,操作非常简单,点击https://github.com/MicrosoftArchive/redis/ ...
- Redis 简单介绍(知识整理笔记)
前言: Redis 介绍:轻量级.Key-Value.内存数据库.支持持久化 Redis 数据结构:string(字符串),hash(哈希),list(列表),set(集合)及 zset (sorte ...
- Redis 知识 整理
简介 安装 启动 注意事项 使用命令 通用命令 数据结构 字符串(string) 哈希(hash) 队列(list) 集合(set) 有序集合(zset) 位图(bitcount) 事务 订阅与发布 ...
- Redis源码学习:字符串
Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...
- redis简单应用
启动和结束 --启动redis服务 E:\redis>redis-server.exe redis.windows.conf --结束redis服务 127.0.0.1:6379> shu ...
随机推荐
- Python面向对象之派生和组合
[一]什么是派生 派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法 [二]派生的方法 子类可以派生出自己新的属性,在进行属性查找时,子类中的属性名会优先于父类被查找 例如每个老 ...
- aardio 代码格式化 自动保存 自定义 ctrl + s bug:这个快捷键是全局拦截
aardio 代码格式化工具 https://gitee.com/pengchenggang/aardio---code-formatting-tool 修改内容 1 代码进行了一定的修改,默认ctr ...
- .bat 批处理 手册 教程
有时候bat写个脚本 还是挺方便的,网上也没有不错的手册,有时间再整理看吧.网上找几个,先留存. 系统变量 %USERPROFILE% https://blog.csdn.net/ztx114/art ...
- iview viewdesign 里面的Select 输入添加 query不能从新为空 @on-create 解决方案 v-if 从新刷一遍
iview viewdesign 里面的Select 输入添加 query不能从新为空 @on-create 解决方案 v-if 从新刷一遍
- C++ 中的关联,聚合,组合 以及 它们的生命周期。
关联,C++使用指针实现,两者到关系最弱,并且可以两向关联,B* A::b 与 A* B::a 可以并存,两者间没有明确的ownership关系,为什么不是引用,因为引用没有办法实现相向引用,这会是一 ...
- dotNet8 全局异常处理
前言 异常的处理在我们应用程序中是至关重要的,在 dotNet 中有很多异常处理的机制,比如MVC的异常筛选器, 管道中间件定义try catch捕获异常处理亦或者第三方的解决方案Hellang.Mi ...
- 记录--Vue3+TS(uniapp)手撸一个聊天页面
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Vue3+TS(uniapp)手撸一个聊天页面 前言 最近在自己的小程序中做了一个智能客服,API使用的是云厂商的API,然后聊天页面.. ...
- 记录--ThreeJs手搓一个罗盘特效
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 先上效果 前言 最近在学Three.js.,对着文档看了一周多,正好赶上码上掘金的活动,就顺便写了一个小demo,手搓一个罗盘特效. 太极 ...
- 从零开始的 dbt 入门教程 (dbt cloud 自动化篇)
一.引 在前面的几篇文章中,我们从 dbt core 聊到了 dbt 项目工程化,我相信前几篇文章足够各位数据开发师从零快速入门 dbt 开发,那么到现在我们更迫切需要解决的是如何让数据更新做到定时化 ...
- 分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 file_line https://github.com/ ...