如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。
字符串长度大于39字节的时候,使用简单动态字符串,对象编码为RAW。小于等于39字节的时候使用embstr编码格式保存为字符串。
使用场景
Value除了是字符串以外还可以是数字。
计数器、统计多单位的数量、粉丝数、对象缓存存储。
用法:
set k1 v1
get k1
keys * //查看所有key
strlen k1
exists k1 //查看是否存在
append k1 “asda” //不存在就新建
incr k1 //自增
decr k1 //自减
incrby k1 10 //步长10增加
decrby k1 10 //步长减少10
incr操作具有原子操作的特性,可以用来实现原子计数。
getrange k1 0 3 //截取字符串,闭区间[0,3]
getrange k1 0 -1 //查看整个字符串
setrange k1 1 xx //替换指定位置开始的字符串,从下标1开始替换成xx
分布式锁中会使用
setex k1 10 //设置k1 10s的过期时间
setnx mykey “ myvalue” //不存在再设置
ttl k1 //查看k1剩余时间
批量设置和获取
mset k1 v1 k2 v2 k3 v3
mget k1 k2 k3 //批量获取key的值
msetnx k1 v1 k4 v4 //redis的事务不具有原子性但是操作具有原子性,msetnx要么全部成功要么全部回滚。
对象user : {id} : {filed}
set user :1 {name : zhangsen, age : 3 , sex : f}
mset user : 1 : name zhangsan user : 1 : age 2
mget user : 1 : name user:1:age
getset k1 20 //先获取k1的值,再设置成20,不存在返回nil
lists的底层实现是链表,头部和尾部插入速度极快,但定位会比较慢。
key不存在,创建新的链表。移除了所有的值,空链表也是不存在。
应用场景:
1. 我们可以利用lists来实现一个消息队列(Lpush Rpop)(重点),而且可以确保先后顺序,不必像MySQL需要通过ORDER BY来进行排序。
2. 利用LRANGE还可以很方便的实现分页的功能。
3. 在博客系统中,每片博文的评论也可以存入一个单独的list中。
4. 栈(Lpush Lpop)
插入
lpush list one
lpush list two
lpush list three //左边插入,头插
lrange list 0 1 //返回[0,1]元素 这里返回的是three two
rpush list right //右边插入,插入尾部
移除
lpop list //左边移除
rpo list //右边移除
lrem list 0 three //移除指定下标的值,这里是移除下标为0的three
修剪
ltrim list 1 2 //截取指定下标范围的值,会改变list(原地操作)
获取值
lindex list 1 //通过下标获取值
llen list //返回长度
不同list之间移动元素
rpoplpush list mylist //移除list右边的第一个元素放到mylist左边第一个位置
更新值
lset list 1 newvalue //修改指定下标的值,前提是存在这个list
插入值
linsert list before one zero //在one之前插入zero
linsert list after three four //在three之后插入four
集合中元素不重复,无序。
当集合元素都是整数,且数量不超过512个,用整数集合实现。否则用Hash表实现。
应用场景:
QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
sadd myset hello //增加元素
smembers myset //查看集合成员
sismember myset word //查看元素是否属于一个集合
获取元素个数
scard myset //获取元素个数
随机抽选
srandmember myset //随机抽选出指定个数的元素
srandmember myset 2 //随机选出2个元素
删除
spop myset //随机删除
srem myset hello //指定删除
两个集合元素移动
smove myset myset2 hello //将myset中的hello移动到myset2
求差集
sdiff myset myset2
求交集
sinter myset myset2
求并集
sunion myset myset2
应用场景:
微博共同关注(并集)
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
当键值长度都小于64字节,且元素数量小于512个,使用压缩列表实现。否则用Hash表实现。
Map集合, key-
单值设置
hset myhash name zhangsan
hget myhash fileld1
多值设置
hmset myhash name lisi age 15 // 设置多个键值
hmget myhash name age //获取多个键值
hgetall myhash //获取所有的键值
删除
hdel myhash name //删除指定field
hlen myhash //获取field个数或者hash的长度
判断是否存在
hexists myhash field1 //判断某个字段是否存在
hkeys myhash //查看所有的field字段
hvals myhash //获取所有field字段对应的值
hincrby muhash field2 1 //对指定字段的值增加指定数值
hsetnx myhash field 2 newvalue //如果不存在就设置为newvalue 已存在则不能设置
应用:存储变动的信息,存储对象
hset user : name zhangsan age 15 sex female
在set的基础上增加了一个score值。
字典+跳跃表实现:
字典:实现O(1)查找数据。跳跃表:实现有序操作。
set k1 v1
zset k1 score v1
zadd salary 2500 zhangsan //添加一个值
zadd salary 45000 xiaohong 800 xiaoming //添加多个值
排序
zrangebyscore salary -inf +inf
zrangebyscore salary
zrange salary -inf +inf withscores //按照score升序排列,范围在-inf到+inf
zrange salary 0 5000 withscores //按照score升序排列,范围在0到5000
zrevrangebyscore salary 0 5000 withscores //降序排列
删除
zrem salary zhangsan
获取有序集合元素的个数
zcard salary
统计两个区间的元素有多少个
zcount salary
应用场景:
重要消息和普通消息
排行榜(播放量进行排序)
带权重判断