zoukankan      html  css  js  c++  java
  • redis 简单整理——redis 的字符串基本结构和命令[二]

    前言

    简单介绍一下redis的基本结构和命令。

    正文

    redis有5种基本结构:

    1. 字符串

    2. 哈希

    3. 列表

    4. 集合

    5. 有序集合

    那么就来看下其基本命令吧。

    通用命令键:

    1. keys * 查看全部键,一般不怎么用。

    2. dbsize 查看有多少键

    dbsize 效率比较高,直接读取的redis内部缓存的值。

    1. exits key 查看是否存在该键。

    2. del key 删除某个键。

    1. 设置键过期 expire key seconds

    2. ttl 查看键过期时间

    ttl 有3种返回值:

    1. 大于0或者等于0 为键的过期时间

    2. -1 键没有设置过期时间

    3. -2 键不存在

    1. type 查看键的类型

    前面提及到了数据结构。

    但是数据结构也有内部编码这个东西。

    举个例子,比如说list 数据结构,有两种数据编码 linkedlist 和 ziplist 两种内部编码。

    那么如何来查看数据编码呢?

    可以通过object encoding testlist 来查看

    内部编码:

    那么内部编码有什么作用呢?

    1. 内部编码只是针对redis 内部的,对外部基本无感。

    2. 每种内部编码适合不同的场景,比如说ziplist比较节约内存,linkedlist 性能好一些,可以针对不同的需求,做不同的事情。

    然后来谈论一下为什么redis是单线程的原因。

    很多时候我们会说多线程的利用率更高,这是针对多核的情况。

    而我们现在基本上都是多核,那么为什么是单线程呢?

    因为redis的优势在于热数据,什么是热数据呢? 就是操作比较频繁。

    那么对于多线程来说,操作频繁是要加锁的,这里面的机制比较消耗性能。

    其二,虽然redis是单线程,但是也可以利用io 多路复用技术来解决io问题。

    随之而来的单线程的遇到的问题是什么呢? 也是可以马上想到的问题,既然是单线程,那么执行时间应该是比较看重的,如果一个命令执行时间过长,那么是非常致命的。

    那么下面就来了解一下数据结构的一些基本知识吧。

    1. 字符串

    字符串说是字符串,但是实际上可以是(json,xml),甚至是二进制(图片、音频、视频)。

    当然值也是有限制的,不能超过512mb,一般来说是不会操作的,这种形式都成大文件了。

    一些常用命令:

    1. 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

    1. get 获取

    当然也可以使用mget:

    使用mget,可以大大节约网络时间。

    虽然redis的读写能力非常高,但是网络可能会成为其中的一个瓶颈,那么使用mget来说还是可以的。然后实际上mget,也是执行多次命令,而不是一个命令。

    上图可以看到,其命令数其实是一样的,网络时间大大减少。

    1. 字符串模式的其他功能,计数

    incr,取自increase,这个单词。

    incr 有几个返回结果:

    1. 值不是整数,返回错误。

    2. 值是证书,返回自增后的结果。

    3. 键不存在,按照值0自增,返回结果为1,这个东西还是很方便的,我们不需要判断这个值是否存在,减少了我们的逻辑代码。

    除了自增命令,还有decr 自减,increby 自增指定数字,decreby自减指定数字,incrbyfloat 自增浮点数

    不常用命令:

    1. 追加值

    append key value

    1. 字符串的长度

    1. 设置并返回原值

    将hello 设置为了workd,然后返回了原先的值。

    1. 设置指定位置字符

    setrang key offset value

    基本没人用。

    1. 获取部分字符

    getrang key start end

    上面的整理表。

    内部编码

    字符串类型的内部编码有3中:

    1. int 8个字节的长整型

    2. embstr 小于等于39个字节的字符串

    3. row 大于39个字节的字符串

    redis 会根据当前的值类型和长度决定用哪种内部编码实现。

    使用场景

    1. 缓存从redis中获取用户信息

    开发提示

    1. 计数

    实际上一个真实的计数系统要考虑的问题会很多:防作弊、按照不同维 度计数,数据持久化到底层数据源等

    1. 共享session

    虽然有些人说这不就是缓存吗?但是其功能主要是共享,所以还是把其定义为共享比较好。

    一个分布式Web服务将用户的Session信息(例如用户登 录信息)保存在各自服务器中,这样会造成一个问题,出于负载均衡的考 90

    虑,分布式服务会将用户的访问均衡到不同服务器上,用户刷新一次访问可 能会发现需要重新登录,这个问题是用户无法容忍的。

    为了解决这个问题,可以使用Redis将用户的Session进行集中管理,如 图2-12所示,在这种模式下只要保证Redis是高可用和扩展性的,每次用户 更新或者查询登录信息都直接从Redis中集中获取

    1. 限速

    很多应用出于安全的考虑,会在每次进行登录时,让用户输入手机验证 码,从而确定是否是用户本人。但是为了短信接口不被频繁访问,会限制用 户每分钟获取验证码的频率,例如一分钟不能超过5次.

    下一节,hash值。

  • 相关阅读:
    【spring-boot】mybatis-generator 使用入门
    【spring-boot】mybatis 使用入门
    【spring-boot】logback+slf4j 日志组合
    【spring-boot】写一个简单的单元测试
    github执行clone操作时报错
    enable device: BAR 0 [mem 0x00000000-0x003fffff] not claimed
    Meson version is 0.44.1 but project requires >=0.45.
    tig
    Unknown command 'run'
    systemctl enable rc-local.service error
  • 原文地址:https://www.cnblogs.com/aoximin/p/15142466.html
Copyright © 2011-2022 走看看