Redis(二) 常见命令和应用场景
一、基本命令概述
Redis
命令用于在 redis
服务上执行操作。
要在 redis
服务上执行命令需要一个redis
客户端。
Redis
客户端在我们之前下载的redis
的安装包中。
Redis
支持五种数据类型:string
(字符串),hash
(哈希),list
(列表),set
(集合)及zset
(sorted set
:有序集合)等
二、关于Redis
的键key
1、关于key的操作
Redis
键命令用于管理 redis
的键
DEL key
该命令用于在 key 存在时删除key
。
DUMP key
序列化给定 key ,并返回被序列化的值。
EXISTS key
检查给定 key 是否存在。
EXPIRE key seconds
为给定 key
设置过期时间(以秒计)。
PEXPIRE key milliseconds
设置 key
的过期时间以毫秒计。
TTL key
以秒为单位,返回给定 key
的剩余生存时间(TTL
,time to live
) ,-1
表示永远有效,-2
表示无效,0
表示
PTTL key
以毫秒为单位返回key
的剩余的过期时间。
移除 key 的过期时间,key 将持久保持。
PERSIST key
移除 key
的过期时间,key
将持久保持。
KEYS pattern
查找所有符合给定模式( pattern
)的key
。
keys
通配符 获取所有与pattern
匹配的key
,返回所有与该匹配
通配符:
*
代表所有
?
表示代表一个字符
RENAME key newkey
修改Key
的名称
MOVE key db
将当前数据库的key
移动到给定的数据库db
当中
TYPE key
返回 key
所储存的值的类型
2、应用场景
EXPIRE key seconds:
-
限时的优惠活动信息
-
网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
-
手机验证码
-
限制网站访客访问频率(例如:
1
分钟最多访问10
次)
3、key
的命名建议
redis
单个key
存入512M
大小
key
不要太长,尽量不要超过1024
字节,这不仅消耗内存,而且会降低查找的效率;key
也不要太短,太短的话,key
的可读性会降低;- 在一个项目中,
key
最好使用统一的命名模式,例如user:123:password
; key
名称区分大小写,命令不区分大小写。
三、String
1、简介
string
是redis
最基本的类型,一个key
对应一个value
。
string
类型是二进制安全的。意思是redis
的string
可以包含任何数据。比如jpg
图片或者序列化的对象 。
string
类型是Redis
最基本的数据类型,一个键最大能存储512MB
。
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来
二进制安全特点:
-
编码、解码发生在客户端完成,执行效率高
-
不需要频繁的编解码,不会出现乱码
2、String相关的命令
赋值语法:
SET KEY_NAME VALUE
Redis SET
命令用于设置给定key
的值。如果 key
已经存储值,SET
就覆写旧值,且无视类型
SETNX key value
解决分布式锁 方案之一,只有在 key
不存在时设置 key
的值。Setnx
(SET if not exists
) 命令在指定的 key
不存在时,为 key
设置指定的值
MSET key value [key value ...]
同时设置一个或多个 key-value
对
取值语法:
GET KEY_NAME
Redis GET
命令用于获取指定key
的值。如果key
不存在,返回 nil
。如果key
储存的值不是字符串类型,返回一个错误。
GETRANGE key start end
用于获取存储在指定key
中字符串的子字符串。字符串的截取范围由 start
和end
两个偏移量决定(包括start
和 end
在内)
GETBIT key offset
对 key
所储存的字符串值,获取指定偏移量上的位(bit
)
MGET key1 [key2..]
获取所有(一个或多个)给定key
的值
GETSET
语法:
GETSET KEY_NAME VALUE
Getset
命令用于设置指定key
的值,并返回key
的旧值,当 key
不存在时,返回 nil
STRLEN key
返回 key
所储存的字符串值的长度
删除语法:
DEL KEY_Name
删除指定的KEY
,如果存在,返回值数字类型。
自增/自减:
INCR KEY_Name
Incr
命令将key
中储存的数字值增1
。如果key
不存在,那么 key
的值会先被初始化为0
,然后再执行INCR
操作
自增:INCRBY KEY_Name
增量值
Incrby
命令将key
中储存的数字加上指定的增量值
自减:DECR KEY_NAME
或 DECYBY KEY_NAME
减值
decR
命令将 key
中储存的数字减1
字符串拼接:APPEND KEY_NAME VALUE
Append
命令用于为指定的key
追加至未尾,如果不存在,为其赋值 。
3、应用场景
-
String通常用于保存单个字符串或JSON字符串数据**
-
因String是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储
-
计数器(常规key-value缓存应用。常规计数: 微博数, 粉丝数)本身数量比较大,不能立刻增加到数据库中。
INCR
等指令本身就具有原子操作的特性,所以我们完全可以利用redis
的INCR
、INCRBY
、DECR
、DECRBY
等指令来实现原子计数的效果。假如,在某种场景下有3
个客户端同时读取了mynum
的值(值为2
),然后对其同时进行了加1
的操作,那么,最后mynum
的值一定是5
。
不少网站都利用redis
的这个特性来实现业务上的统计计数需求。
四、hash
1、简介
Redis hash
是一个string
类型的field
和value
的映射表,hash
特别适合用于存储对象。 Redis
中每个 hash
可以存储2^32 - 1
键值对(40
多亿)
可以看成具有KEY
和VALUE
的MAP
容器,该类型非常适合于存储值对象的信息,
如:uname
,upass
,age
等。该类型的数据仅占用很少的磁盘空间(相比于JSON
)
2、hash相关的命令
赋值语法:
HSET KEY FIELD VALUE
为指定的KEY
,设定FILD/VALUE
HMSET KEY FIELD VALUE [FIELD1,VALUE1]……
同时将多个 field-value
(域-值)对设置到哈希表 key
中。
取值语法:
HGET KEY FIELD
获取存储在HASH中的值,根据FIELD得到VALUE
HMGET key field[field1]
获取key所有给定字段的值
HGETALL key
返回HASH表中所有的字段和值
HKEYS key
获取所有哈希表中的字段
HLEN key
获取哈希表中字段的数量
删除语法:
HDEL KEY field1[field2]
删除一个或多个HASH
表字段
其它语法:
HSETNX key field value
只有在字段field
不存在时,设置哈希表字段的值
HINCRBY key field increment
为哈希表key
中的指定字段的整数值加上增量 increment
。
HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量increment
。
HEXISTS key field
查看哈希表 key
中,指定的字段是否存在。
3、应用场景
Hash
的应用场景:(存储一个用户信息对象数据)
-
常用于存储一个对象
-
为什么不用
string
存储一个对象?
hash
是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap
存放在redis
中。
用户ID
为查找的key
,存储的value
用户对象包含姓名,年龄,生日等信息,如果用普通的key/value
结构来存储,主要有以下2
种存储方式:
用String
类型:第一种方式将用户ID
作为查找key
,把其他信息封装成一个对象以序列化的方式存储得到一个json
串,这种方式的缺点是,增加了序列化/反序列化的开销(就是json
串转化成对象),并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS
等复杂问题,(redis
是单线程,插入保证原子性要排队保护)。
用hash
的类型: 第二种方法是这个用户信息对象有多少成员就存成多少个key-value
对,用用户ID+
对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID
为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。
总结:
Redis
提供的Hash
很好的解决了这个问题,Redis
的Hash
实际是内部存储的Value
为一个HashMap
,并提供了直接存取这个Map
成员的接口。