Redis入门【三】---------字符串(String)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tacks/article/details/82421114

前言

(字符串)String最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)

一 常用命令

【1】set与get,mset与mget,setex与setnx

#<1>设置指定的key的值
set key value [EX seconds] [PX milliseconds] [NX|XX]
#<2>获取key的值
get key

#<3>用于同时设置一个或多个 key-value 对
mset key value [key value ...]
#<4>返回所有(一个或多个)给定 key 的值
mget key [key ...]

#<5>使用键和到期时间来设置值,如果key已经存在,setex 命令将会替换旧的值。
setex key seconds value
#<6>命令在指定的key不存在时,为key 设置指定的值(set if not exists)
setnx key value

set
字符串类型的值实际可以是字符串( 简单的字符串、 复杂的字符串( 例如JSON、 XML) ) 、 数字( 整数、 浮点数) , 甚至是二进制( 图片、 音频、 视频) , 但是值最大不能超过512MB。存在key,则修改,不存在则创建
set的可选参数
[ex seconds]: 为键设置秒级过期时间。
[pxmilliseconds]: 为键设置毫秒级过期时间。
[nx]: 键必须不存在, 才可以设置成功, 用于添加。相当于setnx
[xx]: 与nx相反, 键必须存在, 才可以设置成功, 用于更新。
返回:如果设置成功返回OK。
get
返回 :如果存在,则返回key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。
mset
返回 :总是返回 OK
mget
返回 : 按照你get的顺序,以列表顺序的显示key的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil
注意原子操作和查询效率
事实上像mset,mget批量操作命令可以有效提高开发效率, 假如没有mget这样的命令,那么需要设置大量的key,那么从客户端一个一个的用set,向服务器redis设置,绝对没有一次将要set的值全部利用mset发送到服务器省时间。
n次get时间 = n次网络时间 + n次命令时间(用get来获取)
n次get时间 = 1次网络时间 + n次命令时间(用mget来获取)
合理使用批量操作, 有助于提高业务处理效率
还有一件事:
比如博客上会统计评论数和访问数。如果我们依次读取这两部分的值,那么可能得到的两个值并不是同一时刻的。而如果使用mget,则得到的一定是同一时刻的。
setex
返回:设置key的值,过期时间,成功返回OK
setnx
返回:只能设置不存在的key的值,不能覆盖已有的key。成功返回1,失败返回0
msetmget
setex
setnx

【2】incr与decr , incrby与decrby

#<7>将键的整数值增加1
incr key
#<8>将键的整数值减1
decr key

#<9>将键的整数值按给定的数值增加
incrby key increment
#<10>将键的整数值按给定的数值减少
decrby key increment

incr
注意
incr:对与数值型的进行加一操作,类似i++
常常用与计数器使用
该指令可以用与新的key,或者旧的key的使用
1)新的key,相当于创建该key,同时设置为1的信息
2)旧的key,要求该key的类型为数值型(数字值在 Redis 中以字符串的形式保存)
返回
值不是整数, 返回错误。(error) ERR value is not an integer or out of range
值是整数, 返回自增后的结果。
键不存在, 按照值为0自增, 返回结果为1
其他
decr:操作与incr类似,是减一操作。
incrby:按照指定的幅度进行累加incrby key increment
decrby:按照指定的幅度进行减少
incr

【3】setrange与getrange(substr)

#<11>字符串覆盖给定key所储存的字符串值,覆盖的位置从偏移量 offset 开始
setrange key offset value
#<12>返回 key 中字符串值的子字符
getrange(substr) key start end

setrange
offset是开始的偏移量, 偏移量从0开始计算,不能有负数
返回:返回整数 - 字符串在修改后的长度。
getrange(substr)
start和end分别是开始和结束的偏移量, 偏移量从0开始计算, 可以使用负偏移,以便从字符串的末尾开始计算偏移。它通过将结果范围限制为字符串的实际长度来处理范围外的请求。
返回:截取得到的子字符串。
Tip:如果getrange key 0 -1 表示就是字符串本身的值
这个getrange和substr好像用法一样,这个需要再看一下。
setrange
getrange

【4】append,strlen

#<13>将指定值附加到键的后面
append key value
#<14>获取存储在键中的值的长度
strlen key

append
返回:返回一个整数,在追加操作后的字符串的长度。
strlen
返回:返回在键中的值的字符串长度,或当键不存在时返回0
4

【5】getset

#<15>设置键的字符串值并返回其旧值, 如果键不存在,则返回nil
getset key value

getset

【6】命令小结

stringall

二 内部编码

字符串类型的内部编码有3种。
Redis会根据当前值的类型和长度选择使用哪种类型编码实现。
①int 8个字节的长整型。
②embstr 小于等于39个字节的字符串。
③raw 大于39个字节的字符串。
优点
第一,可以改进内部编码,而对外的数据结构和命令没有影响,这样一旦开发开发出优秀的内部编码,无需改动外部数据结构和命令。
第二,多种内部编码实现可以在不同场景下发挥各自的优势。
encoding

三 典型场景

【1】缓存功能
mysql+redis的缓存存储架构
刚开始redis里面没有数据,那么用户去访问,再redis缓存层没有hit到用户需要的数据,那么它就会向下访问mysql存储层,获取数据返回给用户,同时也要写入缓存到缓存层并设置数据的过期时间。这样下次,如果再缓存层获取到数据,那么直接就可以返回给用户。
redis与关系型数据库mysql不同,它没有命令空间,那么它的键名的设置就要注意一下,合理设置键名可以有利于防止键冲突和项目的可维护性。如果MySQL的数据库名为redis, 用户表名为user, 那么对应的键可以用”redis:user:1”,类似这种,数据库:表:编号,当然你也可以用别的,只要项目中统一用一种格式来命名就比较好一些
redis+mysql
【2】计数
许多应用都会使用Redis作为计数的基础工具, 它可以实现快速计数、查询缓存的功能, 同时数据可以异步落地到其他数据源。例如视频的播放量
【3】共享Session
一个分布式Web服务将用户的Session信息( 例如用户登录信息) 保存在各自服务器中, 这样会造成一个问题, 出于负载均衡的考虑, 分布式服务会将用户的访问均衡到不同服务器上, 用户刷新一次访问可能会发现需要重新登录, 这个问题是用户无法容忍的。
为了解决这个问题, 可以使用Redis将用户的Session进行集中管理, 如图2-12所示, 在这种模式下只要保证Redis是高可用和扩展性的, 每次用户更新或者查询登录信息都直接从Redis中集中获取。
session
【4】限制请求次数
很多应用出于安全的考虑, 会在每次进行登录时, 让用户输入手机验证码, 从而确定是否是用户本人。 但是为了短信接口不被频繁访问, 会限制用户每分钟获取验证码的频率。或者像很多的登陆界面,如果密码在一天内多次错误,将会禁止今天登陆。

猜你喜欢

转载自blog.csdn.net/Tacks/article/details/82421114