一.五种数据类型:
- 1.字符串(String)
- 2.字符串列表(list)
- 3.有序字符串集合(sorted set)
- 4.哈希(hash)
- 5.字符串集合(set)
1.1字符串(String)
常用命令
- 赋值:
set 键 值
- 取值:
get 键
getset 键 新值 -->得到键的值,并赋予新值
- 删除:
del 键
- 数值增减:
incr 键 -->给这个值+1,也就是递增
如果键没有值,那么给键赋值0并且+1;
如果键不能转成数值,那么报错;
decr 键 -->递减,与递增同理;
- 拓展命令:
incrby 键 数 -->递增键这个值数这么多;
原理同incr 键
decrby 键 数 -->递减键这个值数这么多;
原理同decr 键
append 键 新值 -->在键的这个值后面加上新值;
如果键的值存在,那么在后面拼接新值;
如果键的值不存在,那么创建这个键的值为新值;
1.2字符串列表(list)
按照插入顺序排序的字符串链表,和数据结构中的链表是一样的,可以在头部和尾部插入元素.链表的两头插入和删除是非常效率的.如果是作用在链表的中间的,就不太效率了.list中可以有重复元素
1.2.1ArrayList使用数组方式,根据索引查询速度非常快,但是新增和删除比较慢
1.2.2LinkedList使用双向链接方式,每个元素都记录了前后元素的指针,所以插入和删除数据只是改变前后元素的指针指向即可,所以非常效率.
常用命令
- 两端添加
//左侧插入
lpush list名 值1 值2 值3 -->创建一个名为list名的list 如果存在这个list 就向里面添加值1,值2,值3;如果不存在就创建一个list并向其中添加值1,值2,值3;这时候他是这个样子的:
值3 值2 值1
//右侧插入
rpush list名 值1 值2 值3 -->创建一个名为list名的list 如果存在这个list 就向里面添加值1,值2,值3;如果不存在就创建一个list并向其中添加值1,值2,值3;这时候他是这个样子的:
值1 值2 值3
- 查看列表
lrange my list名 start end -->查看名为list名的list中的元素,从第start开始,到第end结束;这里注意start和end可以是负数,当时-1时,表示的是最后一个元素,同理,-2就是倒数第二个元素.
- 两端弹出
//左侧弹出
lpop list名 -->这个就是把左面的(头部)第一个元素弹出,弹出成功返回这个元素,如果这个元素为空返回nil
//右侧弹出
rpop list名 -->这个就是把右面的(尾部)第一个元素弹出,弹出成功返回这个元素,如果这个元素为空返回nil
- 获取列表元素个数
llen list名 -->获取list名的元素个数.
- 拓展命令
//插入
//仅当list存在时才会向头部插入值
lpushx list名
//仅当list存在时才会向尾部插入值
rpushx list名
//更改某一个元素的值,更改第角标个元素的值为value,如果这个元素不存在返回nil
lset list名 角标 value
//在某一个元素之前插入一个值
insert list名 before 值1 值2 -->在名为list名的链表中,在值为值1的元素前面插入一个值为值2的元素.
//在某一个元素之后插入一个值
insert list名 after 值1 值2 -->在名为list名的链表中,在值为值1的元素后面插入一个值为值2的元素.
//删除
//删除list中count个值是value的元素,如果count>0就从左边开始遍历删除,count<0就从右边开始遍历删除;count=0就删除所有值时value的元素.
lrem list名 count value
//尾部弹出添加到头部
rpoplpush list名1 list名2 -->将list名1的尾部元素弹出,压入到list名2的头部;
1.3哈希(hash)
哈希类型可以看成是Java中的Map<String,String>
常用命令
- 赋值
hset map名 键 值 -->给名为map名的hash赋值一个键值对;
hmset map名 键1 值1 键2 值2 ... -->给名为map名的hash一起赋很多值
- 取值
hget map名 键 -->得到名为map名的hash中的key为键的值;
hmget map名 键1 键2 .. ->>得到名为map名的hash中的多个键的值;
hgetall map名 -->获取这个map名的hash中的所有键和值;
- 删除
hdel map名 键 -->删除map名的hash中的key为键的值
del map名 -->删除整个map名的hash
- 数值增减
hincrby map名 键 数 -->给名为map名的hash的key为键的值 +数;
- 其他
判断值存在否?
hexists map名 键 -->判断名为map名的hash的key为键的值存在否?存在返回1;不存在返回0;
有多少个键值对
hlen map名 -->返回有多少个键值对;
获得所有的key
hkeys map名 -->得到所有的key
获得所有的值
hvalues map名 -->得到所有的valu
1.4字符串集合(set)
和List类型不同的是,Set集合中不允许出现重复的元素
常用命令
- 添加/删除元素
sadd myset名 值1 值2 值3 -->向名为myset名的set中添加值1 值2 值3,如果值存在那么添加不进去.
srem myset名 值1 值2 -->删除名为myset名的set的值1 值2 元素
- 获得集合中的元素
smembers myset名 -->查看名为myset名的set中的所有值
- 集合中的差集运算
返回两个集合中相差的元素
sdiff myset名1 myset名2 -->列出两个set集合的不同的元素,按照key的顺序排列.
- 集合中的交集运算
sinter myset名1 myset名2 -->求出两个set集合交集部分
- 集合中的并集运算
sunion myset名1 myset名2 -->合并
- 拓展命令
判断某个值是否在某个set中
sismember myset名 值1 -->判断值1是否在名为myset名的set中
获得set中成员的数量
scard myset名 -->得到myset名的具体数量
随机获得set中的一个元素
srandember myset名 -->返回myset名中的一个随机元素
把两个set的相差元素存到一个新的set中
sdiffstore newset set1 set2 -->把set1和set2的差值元素保存到newset中.
把两个set的交集元素存到一个新的set中
sinterstore newset set1 set2 -->把set1和set2的交集元素保存到newset中.
把两个set的并集元素存到一个新的set中
sunionstore newset set1 set2 -->把set1和set2的并集元素保存到newset中.
使用场景:跟踪一些唯一性的一些访问.
1.5有序字符串集合(sorted set)
与set的区别是,有一个分数与每一个元素对应,也就是元素的位置是有序的.
常用命令
- 添加元素
zadd sort名 分数1 元素1 分数2 元素2 -->向名为sort名的sorted set中添加元素1 和元素2;他们的分数是分数1 和分数2;如果向该sorted set中添加重复的元素,后添加的元素分数会替换之前的.
- 获得元素
zscore mysort名 元素1 -->获取名为mysort名中元素1的分数值
zcard mysort名 -->获取mysort名的set的元素个数
- 删除元素
zrem mysort名 元素1 元素2 -->删除set中的元素1和元素2
zremrangebyrank mysort名 0 4 -->按照范围删除,从第一个开始,删除四个
zremrangebyscore mysort名 80 100 -->删除80 到100之间分数的元素
- 范围查询
zrange mysort名 0 -1 -->查询名为mysort名的set的元素,从第一个到最后一个
zrange mysort名 0 -1 withscores -->查询名为mysort名的set的元素,从第一个到最后一个,并且连同分数一起查询出来.元素在前,分数在后.这个是按照分数由小到大排序的.
zrevrange mysort名 0 -1 withscores -->从大到小的排名
- 扩展命令
返回分数在某个之间的元素,并且按分数从低到高排序
zrangebyscore mysort名 0 100 withscores limit 0 2 -->返回分数由低到高且分数0到100的两个元素和分数.
给某个元素分数增加
zincrby mysort名 数 元素1 -->给mysort名的set中的元素1的分数加上一个数;
获取某个分数区间的元素个数
zcount mysort 数1 数2 -->显示分数在数1和数2中的元素的个数;
使用场景:大型游戏的积分排行榜
二.Key定义的注意点
- 1.不要过长,最好不要超过1024字节;
- 2.不要过短,影响可读性;