Redis学习笔记—数据类型:字符串(string)

字符串是Redis最基础的数据结构。首先键是字符串类型,而且其他几种类型都是在字符串类型的基础上构建的。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

设置值

set命令
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds:为键设置秒级过期时间
127.0.0.1:6379> set hello world ex 50
OK
px milliseconds:为键设置毫秒级过期时间。
127.0.0.1:6379> set hello world px 50000
OK
nx:键必须不存在,才可以设置成功,用于添加。
127.0.0.1:6379> set hello world nx
OK
127.0.0.1:6379> set hello world nx
(nil)
xx:与nx相反,键必须存在,才可以设置成功,用于更新。
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> set hello world xx
(nil)
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set hello world1 xx
OK
setex命令(设置过期时间)
setex key seconds value

下面四个例子都是设置key为hello的缓存过期时间50秒

127.0.0.1:6379> setex hello 50 world
OK
127.0.0.1:6379> set hello world ex 50
OK
127.0.0.1:6379> set hello world px 50000
OK
127.0.0.1:6379> expire java 50
(integer) 1
setnx命令(如果key存在则不做操作,如果没有则创建)
setnx key value

由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:http://redis.io/topics/distlock

获取值

get key

批量设置值

mset key value [key value ...]

批量设置a,b,c三个key

127.0.0.1:6379> mset a 1 b 2 c 3
OK

批量获取值按顺序返回

mget key [key ...]

批量获取a,b,c三个key值

127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"

批量操作可以减少项目和redis数据库的网络请求,如果循环获取每条,那每条都要走网络请求,跟内存速度比,网络绝对是性能的瓶颈,所以批量操作是交给redis内部处理,一次请求,一次返回,有利于提高业务处理效率;但是要注意的是每次批量操作所发送的命令数不是无节制的,如果数量过多可能会造成Redis的阻塞或者网络拥塞。

计数

自增
incr key
自减
decr key
自增指定数
incr key increment
自减指定数
decrby key decrement
自增浮点数
incrbyfloat key increment

很多存储系统和编程语言内部使用CAS机制实现计数功能,会有一定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。

追加值

append key value

举例说明:

127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> append hello is
(integer) 7
127.0.0.1:6379> get hello
"worldis"

获取字符串长度

strlen key

举例说明:

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> strlen hello
(integer) 5

设置并返回值(如果原来有值则返回原来的值)

getset key value

举例说明:

127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> getset hello world1
"world"
127.0.0.1:6379> get hello
"world1"

设置指定位置的字符

setrange key offeset value

举例说明:

127.0.0.1:6379> set java redis
OK
127.0.0.1:6379> setrange java 0 j
(integer) 5
127.0.0.1:6379> get java
"jedis"

获取部分字符串

getrange key start end

举例说明:

127.0.0.1:6379> get java
"jedis"
127.0.0.1:6379> getrange java 1 3
"edi"

查看内部编码

127.0.0.1:6379> object encoding hello
"embstr"

字符串类型的内部编码有3种:
– int:8个字节的长整型。
– embstr:小于等于39个字节的字符串。
– raw:大于39个字节的字符串。

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

典型使用场景  (三个例子)

  1. 做存储层不常改变的,但是又经常需要访问的数据的一个缓存层,减轻数据库压力

  1. 做用户session的存储器,解决分布式服务负载均衡而出现的session不同步问题

  1. 计数,例如网页的浏览量,视频播放量,如果每次都调用接口存数据库会造成大量请求的出现,极大地影响性能,可以先存在redis,之后再进行持久化

发表评论

邮箱地址不会被公开。 必填项已用*标注