字符串是Redis最基础的数据结构。首先键是字符串类型,而且其他几种类型都是在字符串类型的基础上构建的。字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
设置值
set
命令
1 | set key value [ex seconds] [px milliseconds] [nx|xx] |
ex seconds
:为键设置秒级过期时间。
1 | 127.0.0.1:6379> set hello world ex 50 |
px milliseconds
:为键设置毫秒级过期时间。
1 | 127.0.0.1:6379> set hello world px 50000 |
nx
:键必须不存在,才可以设置成功,用于添加。
1 | 127.0.0.1:6379> set hello world nx |
xx
:与nx相反,键必须存在,才可以设置成功,用于更新。
1 | 127.0.0.1:6379> del hello |
setex
命令(设置过期时间)
1 | setex key seconds value |
下面四个例子都是设置key为hello的缓存过期时间50秒
1 | 127.0.0.1:6379> setex hello 50 world |
setnx
命令(如果key存在则不做操作,如果没有则创建)
1 | setnx key value |
由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案,Redis官方给出了使用setnx实现分布式锁的方法:http://redis.io/topics/distlock。
获取值
1 | get key |
批量设置值
1 | mset key value [key value ...] |
批量设置a,b,c三个key
1 | 127.0.0.1:6379> mset a 1 b 2 c 3 |
批量获取值按顺序返回
1 | mget key [key ...] |
批量获取a,b,c三个key值
1 | 127.0.0.1:6379> mget a b c |
批量操作可以减少项目和redis数据库的网络请求,如果循环获取每条,那每条都要走网络请求,跟内存速度比,网络绝对是性能的瓶颈,所以批量操作是交给redis内部处理,一次请求,一次返回,有利于提高业务处理效率;但是要注意的是每次批量操作所发送的命令数不是无节制的,如果数量过多可能会造成Redis的阻塞或者网络拥塞。
计数
自增
1 | incr key |
自减
1 | decr key |
自增指定数
1 | incr key increment |
自减指定数
1 | decrby key decrement |
自增浮点数
1 | incrbyfloat key increment |
很多存储系统和编程语言内部使用CAS机制实现计数功能,会有一定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。
追加值
1 | append key value |
举例说明:
1 | 127.0.0.1:6379> get hello |
获取字符串长度
1 | strlen key |
举例说明:
1 | 127.0.0.1:6379> set hello world |
设置并返回值(如果原来有值则返回原来的值)
1 | getset key value |
举例说明:
1 | 127.0.0.1:6379> get hello |
设置指定位置的字符
1 | setrange key offeset value |
举例说明:
1 | 127.0.0.1:6379> set java redis |
获取部分字符串
1 | getrange key start end |
举例说明:
1 | 127.0.0.1:6379> get java |
查看内部编码
1 | 127.0.0.1:6379> object encoding hello |
字符串类型的内部编码有3种:
- int:8个字节的长整型。
- embstr:小于等于39个字节的字符串。
- raw:大于39个字节的字符串。
Redis会根据当前值的类型和长度决定使用哪种内部编码实现。
典型使用场景 (三个例子)
1)做存储层不常改变的,但是又经常需要访问的数据的一个缓存层,减轻数据库压力
2)做用户session的存储器,解决分布式服务负载均衡而出现的session不同步问题
3)计数,例如网页的浏览量,视频播放量,如果每次都调用接口存数据库会造成大量请求的出现,极大地影响性能,可以先存在redis,之后再进行持久化