一、Redis命令
Redis 命令用于在Redis服务上执行操作,Redis支持五种数据类型;分别是 string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等
常用命令key管理
keys * : 返回满足的所有键 ,可以模糊匹配 比如 keys abc* 代表 abc 开头的 key
exists key :是否存在指定的key,存在返回1,不存在返回0
expire key second:设置某个key的过期时间 时间为秒
del key: 删除某个keyttl key:查看剩余时间,当key不存在时,返回 -2;存在但没有设置剩余生存时间时,返回 -1,否则,以秒为单 位,返回 key 的剩余生存时间。
persist key:取消过去时间
PEXPIRE key milliseconds: 修改key 的过期时间为毫秒
select : 选择数据库 数据库为0-15(默认一共16个数据库) 设计成多个数据库实际上是为了数据库安全和备份
move key dbindex : 将当前数据中的key转移到其他数据库
randomkey: 随机返回一个key
rename key key2 : 重命名key
echo: 打印命令
dbsize: 查看数据库的key数量
info: 查看数据库信息
config get * : 实时传储收到的请求,返回相关的配置
flushdb: 清空当前数据库
flushall: 清空所有数据库
DEL key
该命令用于在 key 存在时删除 key。 复制代码
EXISTS key
检查给定 key 是否存在。 复制代码
EXPIRE key seconds
为给定 key 设置过期时间(以秒计)。 复制代码
PEXPIRE key milliseconds
设置 key 的过期时间以毫秒计。 复制代码
TTL key
以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live) 复制代码
PTTL key
以毫秒为单位返回 key 的剩余的过期时间。 复制代码
KEYS pattern
查找所有符合给定模式( pattern)的 key。 keys 通配符 获取所有与pattern匹配的key,返回所有与该匹配 通配符: * 代表所有 ? 表示代表一个字符 复制代码
RENAME key newkey
修改Key的名称 复制代码
MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中 复制代码
TYPE key
返回 key 所储存的值的类型 复制代码
应用场景
EXPIRE key seconds应用场景
- 限时的优惠活动信息
- 网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
- 手机验证码
- 限制网站访客访问频率(例如:1分钟最多访问10次)
Key的命名建议,redis单个key允许存入512M大小
- key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
- key也不要太短,太短的话,key的可读性会降低;
- 在一个项目中,key最好使用统一的命名模式,例如user:123:password;
- key名称区分大小写
二、 Redis数据类型
string类型
string类型是Redis最基本的数据类型。
string 数据结构是简单的key-value类型,value其不仅是string,也可以是数字,是包含很多种类型的特殊类型,
string类型是二进制安全的。意思是redis的string可以包含任何数据。 比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串,数值等等。
string命令
赋值语法:
SET KEY_NAME VALUE: (说明:多次设置name会覆盖) (Redis SET 命令用于设置给定 key 的值。如果key已经存储值,SET就覆写旧值,且无视类型)
命令:
SETNX key1 value: (not exist) 如果key1不存在,则设值 并返回1。如果key1存在,则不设值并返回0; (解决分布式锁 方案之一,只有在 key 不存在时设置 key 的值。Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值)
SETEX key1 10 lx: (expired) 设置key1的值为lx,过期时间为10秒,10秒后key1清除(key也清除)
SETRANGE string range value: 替换字符串
取值语法:
GET KEY_NAME: Redis GET命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。
GETRANGE key start end: 用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和end 两个偏移量决定(包括 start 和 end 在内)
GETBIT key offset: 对 key 所储存的字符串值,获取指定偏移量上的位(bit)
GETSET语法: GETSET KEY_NAME VALUE;Getset 命令用于设置指定 key 的值,并返回 key 的旧值,当 key 不存在时,返回 nil
STRLEN key: 返回 key 所储存的字符串值的长度\
删值语法:
DEL KEY_Name: 删除指定的KEY,如果存在,返回值数字类型。
批量写: MSET k1 v1 k2 v2 ... 一次性写入多个值
批量读: MGET k1 k2 k3
GETSET name value: 一次性设值和读取(返回旧值,写上新值)\
自增/自减:
INCR KEY_Name: Incr 命令将 key 中储存的数字值增1。如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行 INCR 操作
应用场景
- String通常用于保存单个字符串或JSON字符串数据
- 因String是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储
- 计数器(常规key-value缓存应用。常规计数: 微博数, 粉丝数)
INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、 DECRBY等指令来实现原子计数的效果。假如,在某种场景下有3个客户端同时读取了mynum的值 (值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。 不少网站都利用 redis的这个特性来实现业务上的统计计数需求。
Hash类型
Hash类型是String类型的field和value的映射表,或者说是一个String集合。hash特别适合用于存储对象,相比较而言,将一个对象类型存储在Hash类型要存储在String类型里占用更少的内存空间,并对整个对象的存取。
可以看成具有KEY和VALUE的MAP容器,该类型非常适合于存储值对象的信息, 如:uname,upass,age等。该类型的数据仅占用很少的磁盘空间(相比于JSON)。
Redis 中每个 hash 可以存储 2的32次方 - 1 键值对(40多亿)
赋值语法:
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中,指定的字段是否存在
应用场景
hash的应用场景:(存储一个用户信息对象数据)
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在 redis中。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储, 主要有以下2种存储方式:
第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了 序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保 护,引入CAS等复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一 标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据, 内存浪费还是非常可观的。
总结: Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap, 并提供了直接存取这个Map成员的接口