一 String一些命令
flushdb//清空当前库的所有key
flushall//清空所有库
move name 1//将name 自本数据库移动到1号数据库
expire name 10//name 10秒过期
exists name//name 是否存在
ttl name//name 剩余时间
type name//查看当前key的类型
append name hello//为name的value追加hello字符串 若name不存在 则相当于set 返回为字符串的长度
strlen name//获取当前字符串长度
set name longs//设置值
get name//获得值
keys *//获得所有key
incr age//自动加1
decr age//自动减1
incrby age 10//+10(步长)
decrby age 10//-10
getrange name 0 3//获取字符串的区间子串(从0开始)
getrange name 0 -1//获取全部的字符串
setrange name 1 xx//替换从1开始 adbc→axxc
setex name 30 long//设置name过期时间30秒(set with expire)
setnx name hai//若name不存在设置value为hai 存在则创建失败(分布式锁常用)(set if not exist)
mset k1 v1 k2 v2//批量设置
mget k1 k2//批量获取
msetnx k1 v1 k3 v3//若有一个重复的key存在则整体设置失败(k3也失败)(原子性操作一起成功或者一起失败)
set user:1 {name:zhangsan,age:3}//设置user:1对象 值为json格式的{name:zhangsan,age:3}
//这种设计可以做到细粒度的查询,如果对象有很多属性但只需要读取其中一个属性,不用返回整个json对象
mset user:1:name zhangsan user:1:age 2//设置两个属性
getset name long//如果不存在值,则返回nil 同时将name设置好值 若存在则不会覆盖value
String应用场景:value除了是我的的字符串还可以是我们的数字
- 计数器
- 统计多单位的数量
- 粉丝数
- 对象缓存存储
二 List一些命令-队列 栈 阻塞队列
//所有的list命令都是以l开头的
lpush list one//123的顺序存入list
lpush list two//将一个或多个值插入列表头部(左)
lpush list three//插入list的值可以重复
lrange list 0 -1//0 -1取出所有 类似栈 顺序为321
lrange list 0 1//区间取值 three two 类似栈
rpush list four//将一个或多个值插入列表尾部(右) lrange顺序为 3214
lpop list//移除list的第一个元素three (左)
rpop list//移除list的最后一个元素four (右)
lindex list 1//通过下标获取值(从0开始) one
llen list//获取链表的长度
lrem list 1 one//移除指定的集合中的1个值(one)改为2就是移除两个one(可以多于实际数量不报错)
ltrim list 0 4//修剪集合 集合只保留修剪后的值 该list已经被改变
rpoplpush list newlist//移除列表最后一个元素(栈底) 并移动到新的列表中
lset list 0 item//指定列表下标赋值 更新操作(列表要存在) 若有值则覆盖 没有值则报错
exists list//判断列表是否存在
clear//清空cmd 看着整洁 入栈顺序与lrange查询的数据是相反的(lrange从栈顶往下数)
linsert list before 1 5//向指定值的后面插入值(右边) list原来为123 之后为1523(入栈顺序)
linsert list after 1 7//向指定值的前面插入值(左边) 71523 有重复会按顺序插在最近的后面
List:实际上是一个链表,before Node after,left,right都可以插入值
- key不存在,创建新的链表
- key存在,新增内容
- 如果移除了所有值,空链表也代表不存在
- 在两边插入或改动值效率最高,中间元素相对来说效率会低一点
- 消息排队 消息队列(Lpush Rpop),栈(Lpush Lpop)
三 set(集合)一些命令:值不能重复
sadd test 2233//添加test集合2233(value)
smembers test//查看test集合元素
sismember test 2233//判断value是否在集合中存在2233 有返回1没有返回0
scard test//获取数据元素个数
srem test 2233//移除集合中的指定元素
srandmember test//随机获取集合中的一个元素 srandmember test 2获取2个
spop test//随机删除一些set集合中的元素
smove test test1 111//移动指定值到另一个set集合中 test中111移动test1中
sdiff key1 key2//返回第一个集合与其他集合的差异 第一个集合(key1)中的独有元素
sinter key1 key2//取两个集合的交集 例如共同好友
sunion key1 key2//取两个集合的并集
set应用场景:微博a用户将所有关注的人放在一个set集合中(不会重复),将他的粉丝也放在一个集合中,共同关注,共同爱好,二度好友,推荐好友(六度分割理论)
四 Hash(哈希)一些命令:
map集合,key-map集合→key-<key-value>,此时的值是map集合 哈希更适合存对象 string适合字符串
hset hash q1 w1//set一个具体的key-value <hash,<q1,w1>>
hget hash q1//获取一个字段值
hmset myhash q2 w2 q3 w3//设置多个kv
hmget myhash q2 q3//获取多个字段值
hgetall myhash//获取全部的数据(kv都要)结果为:1.q2 2.w2 3.q3 4.w3
hdel myhash q2//删除hash指定的字段q2 对应的value也会被删除
hlen myhash//获取当前hash表的键值对长度
hexists myhash q3//判断hash中指定字段是否存在
hkeys myhash//获得所有字段(q2,q3)
hvals myhash//获得所有value(w2,w3)
hset myhash q4 4//设置<hash,<q4,4>>
hincrby myhash q4 1//q4自增1(也可以是其他数字 正负都行)指定增量
hsetnx myhash q3 w3//不存在则创建成功,存在则创建失败
hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息,hash更适合对象的存储,String更适合字符串存储
五 Zash(有序集合)一些命令:
在set的基础上增加了一个值,zset k1 score1 v1(通过score1进行排序)
zadd myset 1 one//添加一个值 (k1 score1 v1)
zadd myset 2 two 3 three//添加多个值
zrange myset 0 -1//获取所有值(由小到大)
zrevrange salary 0 -1//获取所有值(由大到小)
zadd salary 2500 xiaohong//xiaohong发了2500工资
zadd salary 5000 zhangsan//zhangsan发了5000工资
//工资排序 -inf +inf为负无穷到正无穷(由小到大) 是一个数值范围 返回为:1xiaohong 2zhangsan
zrangebyscore salary -inf +inf
//带上工资(score)显示 xiaohong 2500 zhangsan 5000 默认为闭区间 使用开区间需要加半边括号(
zrangebyscore salary -inf +inf withscores
//工资排序由大到小要使用zrevrangebyscore salary 7000 1 (withscores仍然可用)例:(5 (10
zrevrangebyscore salary 7000 1
zrem salary xiaohong//移除有序集合中的指定元素
zcard salary//获取有序集合中的个数
zcount salary 1 7000//获取指定区间的成员数量 闭区间
可以进行工资表排序,或带权重判断(普通消息1,重要消息2),排行榜应用实现,取topN测试