常用命令

image.png

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)
PTTL 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 所储存的值的类型

key命名建议

redis单个key 存入512M大小
1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key也不要太短,太短的话,key的可读性会降低;
3.在一个项目中,key最好使用统一的命名模式,例如user:123:password;
4.key名称区分大小写

String

语法

string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个键最大能存储512MB。

二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来

二进制安全特点:
1、编码、解码发生在客户端完成,执行效率高

2、不需要频繁的编解码,不会出现乱码

set/get 设置key对应的值为String类型的value;获取key对应的值
mget 批量获取多个key的值,如果可以不存在则返回nil mget age name
incr && incrby incr对key对应的值进行加加操作,并返回新的值;incrby加指定值
decr && decrby decr对key对应的值进行减减操作,并返回新的值;decrby减指定值
setnx 解决分布式锁的方案之一,设置key对应的值为String类型的value,如果key已经存在则返回0失败,key不存在则返回1成功
setex 设置key对应的值为String类型的value,并设定有效期 setex 20 111,20秒后过期

getrange 获取key对应value的子字符串 getrange name 0 5
mset 批量设置多个key的值,如果成功表示所有值都被设置,否则返回0表示没有任何值被设置
msetnx 同mset,不存在就设置,不会覆盖已有的key msetnx age1 11 name1 11
getset 设置key的值,并返回key旧的值
append 给指定key的value追加字符串,并返回新字符串的长度
strlen 长度
del 删除key

应用场景

1、String通常用于保存单个字符串或JSON字符串数据
2、因String是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储
3、计数器(常规key-value缓存应用。常规计数: 微博数, 粉丝数)
INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。假如,在某种场景下有3个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum的值一定是5。
不少网站都利用redis的这个特性来实现业务上的统计计数需求。

Hash

语法

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。 Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)
可以看成具有KEY和VALUE的MAP容器,该类型非常适合于存储值对象的信息,
如:uname,upass,age等。该类型的数据仅占用很少的磁盘空间(相比于JSON)

Hash是一个String类型的field和value之间的映射表
redis的Hash数据类型的key(hash表名称)对应的value实际的内部存储结构为一个HashMap
Hash特别适合存储对象,相对于把一个对象的每个属性存储为String类型,将整个对象存储在Hash类型中会占用更少内存
key—-String,value——Map

hset,hmset——设置key对应的HashMap中的field的value
hset shopinfo shop_id 11111 hset shopinfo token 123456
hmset shopinfoshop_id 11111 token 123456

hget,hmget——获取key对应的HashMap中的field的value
hmset shopinfoshop_id token``

hgetall——获取key对应的HashMap中的所有field的value
hgetall shopinfo

hlen—返回key对应的HashMap中的field的数量

hdel—删除属性
hdel shopinfo token

hkeys—获取所有key
hlen—获取属性数量

HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值

HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment 。

HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment 。

HEXISTS key field //查看哈希表 key 中,指定的字段是否存在

应用场景

1、
常用于存储一个对象
2、
为什么不用string存储一个对象?
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:
第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。
总结:
Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口

List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
è类似JAVA中的LinkedList

lpush——在key对应的list的头部添加一个元素 栈 lpush shopitems item1 item2 item3
lpop——从key对应的list的尾部删除一个元素,并返回该元素
lrange——获取key对应的list的指定下标范围的元素,-1表示获取所有元素 lrange shopitems 0 -1
rpush——在key对应的list的尾部添加一个元素
rpop——从key对应的list的尾部删除一个元素,并返回该元素LLEN key //获取列表长度
LINDEX key index //通过索引获取列表中的元素
LRANGE key start stop //获取列表指定范围内的元素
描述: 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
实例
redis 127.0.0.1:6379> BLPOP list1 100
在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待100秒后会返回 nil 。

BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

LTRIM key start stop 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

LSET key index value 通过索引设置列表元素的值
LINSERT key BEFORE|AFTER world value 在列表的元素前或者后插入元素

描述:将值 value 插入到列表 key 当中,位于值 world 之前或之后

RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
示例描述:
RPOPLPUSH a1 a2 //a1的最后元素移到a2的左侧
RPOPLPUSH a1 a1 //循环列表,将最后元素移到最左侧

BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

lpop shopitems
“item3”
> llen shopitems
(integer) 2
> lindex shopitems 1
“item1”
> lrem shopitems 0
(error) wrong number of arguments (given 2, expected 3)
> lrange shopitems 0 -1
1) “item2”
2) “item1”

应用场景

列表数据显示、关注列表、粉丝列表、留言评价等…分页、热点新闻(Top5)等
任务队列

Set

sadd——在key对应的set中添加一个元素
smembers——获取key对应的set的所有元素
spop——随机返回并删除key对应的set中的一个元素
suion——求给定key对应的set并集
sinter——求给定key对应的set交集
SCARD key 获取集合的成员数

SISMEMBER key member 判断 member 元素是否是集合 key 的成员(开发中:验证是否存在判断) SRANDMEMBER key [count] 返回集合中一个或多个随机数
SREM key member1 [member2] 移除集合中一个或多个成员

SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
差集语法:
SDIFF key1 [key2] 返回给定所有集合的差集(左侧)
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
交集语法:
SINTER key1 [key2] 返回给定所有集合的交集(共有数据)
SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
并集语法:
SUNION key1 [key2] 返回所有给定集合的并集
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中

sadd myset news1 news2 news3 news1
(integer) 3
> smembers myset
1) “news1”
2) “news2”
3) “news3”
> spop myset
“news2”
> smembers myset
1) “news1”
2) “news3”
> sadd myset2 news1 news2 news3 news4
(integer) 4
> sdiff myset myset2
(empty list or set)
> sdiff myset2 myset
1) “news4”
2) “news2”
> smembers myset
1) “news1”
2) “news3”
> sunion myset myset2
1) “news1”
2) “news4”
3) “news2”
4) “news3”
> sinter myset myset2
1) “news1”
2) “news3”

应用场景

常应用于:对两个集合间的数据[计算]进行交集、并集、差集运算
1、以非常方便的实现如共同关注、共同喜好、二度好友等功能。对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存储到一个新的集合中。
2、利用唯一性,可以统计访问网站的所有独立 IP

SortSet Zset

zadd ——在key对应的zset中添加一个元素
zrange——获取key对应的zset中指定范围的元素,-1表示获取所有元素
zrem——删除key对应的zset中的一个元素
zrangebyscore——返回有序集key中,指定分数范围的元素列表,排行榜中运用
zrank——返回key对应的zset中指定member的排名。其中member按score值递增(从小到大);
ZCARD key 获取有序集合的成员数
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZRANK key member 返回有序集合中指定成员的索引
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员(低到高)
ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底

ZSCORE key member
返回有序集中,成员的分数值


删除语法:
del key 移除集合
ZREM key member [member …] 移除有序集合中的一个或多个成员
ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
ZINCRBY KEY 30 MEMBER

set是通过hashmap存储,key对应set的元素,value是空对象
sortset是怎么存储并实现排序的呢,hashmap存储,还加了一层跳跃表
跳跃表:相当于双向链表,在其基础上添加前往比当前元素大的跳转链接

zadd myzset 1 “one” 2 “two” 3 “three”
(integer) 3
> zrange 0 -1
> zrange myzset 0 -1
1) “one”
2) “two”
3) “three”
> zrange myzset 0 -1 withscores
1) “one”
2) 1.0
3) “two”
4) 2.0
5) “three”
6) 3.0
> zrem myzset one
1
> zrange myzset 0 -1 withscores
1) “two”
2) 2.0
3) “three”
4) 3.0
> zrangebyscore myzset 2 3
1) “two”
2) “three”
> zadd myzset 6 “six” 10 “ten”
(integer) 2
> zrange myzset 0 -1 withscores
1) “two”
2) 2.0
3) “three”
4) 3.0
5) “six”
6) 6.0
7) “ten”
8) 10.0
> zrangebyscore myzset 0 1000
1) “two”
2) “three”
3) “six”
4) “ten”
> zrank myzset 0 1000
(error) wrong number of arguments (given 3, expected 2)
> zrank myzset ten
3 因为10最大,所以是最后一个3
> zcard myzset
4
> zadd myzset 5 “five”
(integer) 1
> zrange myzset 0 -1
1) “two”
2) “three”
3) “five”
4) “six”
5) “ten”
> zrank myzset five
2

zadd z1 10 m10 20 m20 30 m30 40 m40

(integer) 4 zrange 0 -1 (error) ERR value is not an integer or out of range zrange z1 0 -1

  1. “m10”
  2. “m20”
  3. “m30”
  4. “m40”

zcard z1 4 zcount key 30 40 0 zcount key 10 40 0 zcount key 0 -1 0 zcount z1 30 40 2 zrank z1 m30 2 zrevrange z1 0 -1

  1. “m40”
  2. “m30”
  3. “m20”
  4. “m10”

zincrby z1 20 m30 50.0 zrank z1 m30 3 zrevrange z1 0 -1

  1. “m30”
  2. “m40”
  3. “m20”
  4. “m10”

zrange z1 0 -1

  1. “m10”
  2. “m20”
  3. “m40”
  4. “m30”

zrem z1 m40 1 zrange z1 0 -1

  1. “m10”
  2. “m20”
  3. “m30”

zremrangebyrank z1 1 2 (integer) 2 zrange z1 0 -1

  1. “m10”

zadd z1 20 m20 30 m30 40 m40 (integer) 3 zrange z1 0 -1

  1. “m10”
  2. “m20”
  3. “m30”
  4. “m40”

zremrangebyscore z1 30 40 2 zrange z1 0 -1

  1. “m10”
  2. “m20”

应用场景

常应用于:排行榜
1比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
2比如一个存储全班同学成绩的Sorted Set,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。

3还可以用Sorted Set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

HyperLogLog

image.png
image.png
image.pngimage.png

多数据库

Redis下,数据库是由一个整数索引标识,而不是由一个数据库名称。默认情况下,一个客户端连接到数据库0。
redis配置文件中下面的参数来控制数据库总数:database 16 //(**从0开始 1 2 3 …15)**
select 数据库//数据库的切换



移动数据(将当前key移动另个库)
move key名称 数据库
数据库清空:
flushdb //清除当前数据库的所有key
flushall //清除整个Redis的数据库所有key