String字符串:最基本的数据类型,二进制安全(可以包含任何数据,比如jpg图片或者序列化的对象),它的值最大能存储521M
Hash哈希:String元素组成的字典。适用于存储对象。 存储:hmset yuan name "yuanjins" age 20 ,获取: hget yuan age
List列表:列表,按照String元素插入顺序
Set集合:String元素组成的无需集合,公共哈希表实现,不允许重复
Sorted Set有序集合:通过分是来为集合中的成员进行从小到大的排序。
String字符串
是Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。常见的用途就是缓存用户信息。使用 JSON 序列化成字符串。
常见命令:
键值对
设置name为yuan:set name yuan
获取name值(没有返回nil): get name
判断是否存在name(存在为1,不存在为0):exists name
删除name(1为成功): del name
批量键值对:可以批量对多个字符串进行读写,节省网络耗时开销
设置多个键值对: mset name yuan age 12 address beijing
获取多个键值对: mget name age address
过期和 set 命令扩展:可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间
5s后name过期: expire name 5
设置name为yuan且5s后过期(set+expire): setex name 5 yuan
name不存在创建存在不成功(0/1):setnx name yuan
原子计数:如果 value 值是一个整数,还可以对它进行自增操作。自增是有范围的,它的范围是signed long 的最大最小值,超过了这个值,Redis 会报错
获取age的数递增(+1):incr age
age减掉5: incrby age -5
如何通过redis实现分布式锁
SET key value [EX seconds] [PX milliseconds] [NX|XX]**
EX seconds:设置键的过期时间为econds秒
PX milliseconds:设置键过期时间为milliseconds毫秒
NX:只在键不存在时,才对键进行操作
XX:只在键已存在时,才对键进行设置操作
SET操作成功完成,返回ok,否则返回nil
举例:set locktag "muber" ex 10 nx
List列表
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。
Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理。
右边进左边出:队列
往namelist存放数据: rpush namelist yuan xiang zhang
获取namelist长度:llen namelist
从namelist里往外取数(取完没有时返回nil) lpop namelist ==>多次执行返回数据为:yuan xiang zhang nil,之后namelist没有数据了。
右边进右边出:栈
从namelist外往里取数(取完没有时返回nil):rpop namelist ====>zhang xiang yuan nil
hash (字典)
Redis 的字典相当于 Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。
hash 结构也可以用来存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对 用户结构中的每个字段单独存储。这样当我们需要获取用户信息时可以进行部分获取。而以整个字符串的形式去保存用户信息的话就只能一次性全部读取,这样就会比较浪费网络流量。 hash 也有缺点,hash 结构的存储消耗要高于单个字符串,到底该使用 hash 还是字符串,需要根据实际情况再三权衡。
设置books对象的java属性:hset books java "this is a java"
获取books对象:hgetall books
获取books对象的java属性值:hget books java
获取books对象的长度:hlen books
更新books对象的java属性值(返回0):hset books java "java is ok"
批量设置books的属性:hmset books math "is math" enghlish "okok"
set (集合)
Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。 当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
myset添加数据(返回成功的个数,重复返回0):sadd myset golan
添加多个数据: sadd myset soa soq
获取所有的数据(无序的):smembers myset
查询某个值是否存在(存在返回1,不存在返回0):sismember myset soa
获取myset长度:scard myset
弹出一个数据:spop myset ===>数据依次取出,去完,这个数据也将不存在了
zset (有序集合)
zset 似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。
zset 还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。
设置有序集合:zadd student 9.0 "frist"
按score逆序排序(从小到大): zrange student 0 -1
按score顺序排序(从大到小):zrevrange student 0 -1
获取长度:zcard student
指定value的score: zscore student "frist" ==>返回的score值是double类型,存在小数点精度问题
指定获取value的排名(从小到大):zrank student "frist"
按最小到最大的区间遍历(从小到大):zrangebyscore student 0 9.1
根据区间(负无穷,8.1)遍历zset,同时返回分数:zrangebyscore student -inf 8.1 withscores
根据value删除对应的值:zrem student "frist"