redis自身是一个Map,其中所有的数据都是采用key:value的形式存储
数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串
string –> String
hash –> Hashmap
list –> LinkList
set –> HashSet
sorted_set –> TreeSet
String
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用,最后实际上还是字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 # 设值 192.168.245.129:0>set k1 anthony "OK" # 取值 192.168.245.129:0>get k1 "anthony" # 删除值,成功返回1 192.168.245.129:0>del k1 "1" # 删除值,不成功返回0 192.168.245.129:0>del k1234 "0" # 一次性存入多个值 192.168.245.129:0>mset k1 v1 k2 v2 k3 v3 "OK" # 一次性取出多个值 192.168.245.129:0>mget k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 192.168.245.129:0> # 打印值的长度 192.168.245.129:1>set name anthony "OK" 192.168.245.129:1>get name "anthony" 192.168.245.129:1>strlen name "7" # 追加 # 有数据就追加 192.168.245.129:1>append name 666 "10" 192.168.245.129:1>get name "anthony666" # 没数据就新建 192.168.245.129:1>append othername frankie "7" 192.168.245.129:1>get othername "frankie" # 递增递减,小数不行 192.168.245.129:1>set num 1 "OK" 192.168.245.129:1>incr num "2" 192.168.245.129:1>incr num "3" 192.168.245.129:1>decr num "2" 192.168.245.129:1>decr num "1" # 递增递减指定值,小数不行 192.168.245.129:1>incrby num 4 "6" 192.168.245.129:1>decrby num 2 "4" # 小数不行 192.168.245.129:1>incrby num 1.5 "ERR value is not an integer or out of range" # 递增指定小数,貌似没有递减 192.168.245.129:1>incrbyfloat num 1.5 "5.5" # 指定生命周期 setex key seconds value # setex 秒 # psetex 毫秒 192.168.245.129:1>setex phone2 2 1392465115 "OK" 192.168.245.129:1>get phone2 null
string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
注意:按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线范围,将会报错。9223372036854775807 (java中long型数据最大值,Long.MAX_VALUE)
业务场景 1 2 setex key time value setex userid 100 1
热点数据key命名惯例
Hash
需要的内存结构:一个存储空间保存多少个键值对数据
hash类型:底层使用哈希表结构实现数据存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 # 设值/修改值 hset key filed1 value 192.168.245.129:0>HSET user name zhangsan "1" 192.168.245.129:0>hset user age 38 "1" # 取一个属性值 192.168.245.129:0>hget user age "38" # 取多个属性值 192.168.245.129:0>hmget user age name 1) "45" 2) "zhangsan" # 取一个key 192.168.245.129:0>hgetall user 1) "name" 2) "zhangsan" 3) "age" 4) "38" # 删除一个属性值 192.168.245.129:0>hdel user name "1" 192.168.245.129:0>hgetall user 1) "age" 2) "38" # 查看有多少个属性 192.168.245.129:0>hlen user "3" # 获取所有的属性 192.168.245.129:0>hkeys user 1) "age" 2) "name" 3) "sex" # 获取所有的属性值 192.168.245.129:0>hvals user 1) "45" 2) "zhangsan" 3) "n" # 指定属性增加指定值 192.168.245.129:0>hincrby user age 1 "46"
List 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序 list类型:保存多个数据,底层使用双向链表存储结构实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 # 先插入huawei 192.168.245.129:0>lpush list1 huawei "1" # 再插入apple 192.168.245.129:0>lpush list1 apple "2" # 最后插入Microsoft 192.168.245.129:0>lpush list1 microsoft "3" # 从左边取 192.168.245.129:0>lrange list1 0 2 1) "microsoft" 2) "apple" 3) "huawei" # 一次性插入多条数据 192.168.245.129:0>rpush list2 a b c "3" # 从左边取 # lrange key start stop # lindex key index 取指定索引的值 # llen key 取长度 # 没有rrange 192.168.245.129:0>lrange list2 0 2 1) "a" 2) "b" 3) "c" # 从左边取的第二钟方法 192.168.245.129:0>lrange list2 0 -1 1) "a" 2) "b" 3) "c" # lpop从左边删,rpop从右边删 192.168.245.129:0>lpush list3 a b c "3" 192.168.245.129:0>lpop list3 "c" ---------------------------------------------------------------------------------------------------- # 阻塞取值,从运行命令开始,如果有数据,取出来,立马返回,如果没有数据,就等指定的时间20s,有就立马返回结束,如果没有,就一直等到时间结束 192.168.245.129:0>blpop list4 20 1) "list4" 2) "32" # 删除指定数据 # lrem key count value # count是删除多少个value 192.168.245.129:0>lpush dianzan a b c d "4" 192.168.245.129:0>lrem dianzan 1 c "1" 192.168.245.129:0>lrange dianzan 0 -1 1) "d" 2) "b" 3) "a"
业务场景 list可以对数据进行分页操作,通常第一页的信息来自list,第二页和更多的数据通过数据库形式
也可以用作队列,比如日志收集
Set
list 中保存的数据都是string类型的,数据总容量式由西安的,最多232-1个元素(4294967295)
list具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,或以栈的形式进入栈出栈的操作
获取全部数据操作结束索引设置为-1
list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载
因为list在存查大量数据的时候,存储慢,查询慢,所有有了set
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 # 添加 192.168.245.129:0>sadd users zs "1" 192.168.245.129:0>sadd users lisi "1" 192.168.245.129:0>sadd users ww "1" # 查列表 192.168.245.129:0>smembers users 1) "lisi" 2) "ww" 3) "zs" # 查数量 192.168.245.129:0>scard users "3" # 判断是否有指定数据 192.168.245.129:0>sismember users ls "0" 192.168.245.129:0>sismember users ww "1" 192.168.245.129:0>smembers users 1) "lisi" 2) "ww" 3) "zs" # 删除指定数据 192.168.245.129:0>srem users ww "1" 192.168.245.129:0>smembers users 1) "lisi" 2) "zs" # 随机获取集合中指定数量的数据,获取之后,原来的队列数据不变 srandmember key count # 随机获取集合中的某个数据并讲该数据移除集合 spop key -------------------------------------------------------------------------------------- > sadd u1 a1 1 > sadd u1 a2 1 > sadd u1 a3 1 > sadd u2 a1 1 > sadd u2 a2 1 # 交集 > sinter u1 u2 a2 a1 # 并集 > sunion u1 u2 a1 a2 a3 # 差集 (u1,u2)顺序不一样,结果不一样 > sdiff u1 u2 a3
业务场景 redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点旅游线路,应用APP推荐,大V推荐等
sort_set 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 # 添加数据 > zadd scores 100 zhangsan 1 > zadd scores 90 lisi 1 > zadd scores 95 wangwu 1 # 获取全部数据 > zrange scores 0 -1 lisi wangwu zhangsan # 获取全部数据 > zrange scores 0 -1 withscores lisi 90 wangwu 95 zhangsan 100 # 反向获取全部数据 > zrevrange scores 0 -1 withscores zhangsan 100 wangwu 95 lisi 90 # 删除数据 > zrem scores zhangsan 1 > zrange scores 0 -1 withscores lisi 90 wangwu 95 # 按条件获取数据,可以用作分页 zrangebyscore key min max [WITHSCORES] [LIMIT] zrevrangebyscore key max min [WITHSCORES] # 条件删除 zremrangebyrank key start stop zremrangebyscore key min max -----------------------------------------排名------------------------------------------------------- # 添加模拟数据 > zadd movies 143 aa 97 bb 201 cc 3 # 获取数据对应的索引(排名) > zrank movies bb 0 # 反向获取 > zrevrank movies bb 2 # score 值获取与修改 zscore key member zincrby key increment member
Redis 通用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 -------------------------------------基本操作 # 删除 del key # 获取key是否存在 exists key # 获取key的类型 type key -----------------------------有效期 # 设置指定有效期 # 秒 expire key second # 毫秒 pexpire key milliseconds # 有效期是时间戳 expireat key timestamp # 获取key的有效期 ttl key pttl key 毫秒 # 切换key从时效性变成永久性 persist key -------------------------------------查询 # 具体看图片 keys pattern -------------------------------------其它操作 # 重命名 # 不判断newkey存不存在,newkey就用key的值覆盖,再改成 rename key newkey # 如果newkey 存在,就不能改 rename key newkey
1 2 3 4 5 6 7 8 9 10 11 # 为key改名 rename key newkey //如果已经有newkey的数据,直接覆盖 renamenx key newkey //如果已经有,则失败 # 对所有key排序 sort ----------------------------------------------数据库操作 # 切换数据库 select index
高级数据类型 Bitmaps HyperLogLog GEO