String
127.0.0.1:7000> set name 12 设置name=12 OK 127.0.0.1:7000> get name 或者key为name的value "12" 127.0.0.1:7000> expire name 10 设置name的过期时间为10s 单位:秒 (integer) 1 127.0.0.1:7000> ttl name 查看name的过期时间 (integer) 8 127.0.0.1:7000> ttl name 查看name的过期时间 -2代表已经过期 (integer) -2 127.0.0.1:7000> ttl name (integer) -2 127.0.0.1:7000> setex gender 10 man 设置gender的值为man,过期时间为10秒 OK 127.0.0.1:7000> ttl gender 查看gender的过期时间 (integer) 1 127.0.0.1:7000> setnx gender man 设置gender的值,如果gender不存在,为man,存在则不修改 (integer) 1 127.0.0.1:7000> setnx gender woman gender已经存在,发现执行结果为0,执行不成功 (integer) 0 127.0.0.1:7000> get gender 获得gender的值 "man" 127.0.0.1:7000> mset name ma age 22 gender man 批量设置key OK 127.0.0.1:7000> mget name age gender 批量获取key 1) "ma" 2) "22" 3) "man"
应用场景
1.记录用户的播放量,点赞数,订阅人数等 可以用incr命令使其加1,也可以使用incrby命令,来指定加几;redis中操作是原子性的,不存在并发问题。(举个例子:三个人得到num的是2,同时进行加1操作,最终的结果一定是5)
2.用来存放json数据。将java对象转化为json数据,存放到redis中,需要时从缓存中取出来,再转化为java对象。
3.可以用来存放图片。
4.用来做缓存,可以将一些基础数据,不经常修改的存放在缓存中,减少数据库的访问压力。
5.验证码,登录次数限制等,为String类型的key设置过期时间,用来保存验证码;为key设置自增和过期时间,记录用户输入密码错误的次数,达到一定次数时,限制登录,过期后,可以继续登录。
注意事项
redis中String类型的最大存储空间是512MB。
list
127.0.0.1:7000> lpush name zhangsan lisi wangwu zhaoliu 从左边存入名字为name的list中 (integer) 4 127.0.0.1:7000> lrange name 0 -1 获得name中的全部数据 注意`数据排序` 1) "zhaoliu" 2) "wangwu" 3) "lisi" 4) "zhangsan" 127.0.0.1:7000> rpush name jiuba 从右边push进去 (integer) 5 127.0.0.1:7000> lrange name 0 -1 获取name中的全部数值 1) "zhaoliu" 2) "wangwu" 3) "lisi" 4) "zhangsan" 5) "jiuba" 127.0.0.1:7000> lpop name 从左边弹出一个值 "zhaoliu" 127.0.0.1:7000> rpop name 从右边弹出一个值 "jiuba" 127.0.0.1:7000> lrange name 0 1 获取name集合中下表为0-1`(含头含尾)`的元素值 1) "wangwu" 2) "lisi" 127.0.0.1:7000> lpush name zhangsan zhangsan zhangsan 存入三个zhangsan 发现list可以存重复的值 (integer) 6 127.0.0.1:7000> lrem name 1 zhangsan 移除一个zhangsan (integer) 1 127.0.0.1:7000> lrange name 0 -1 查看name集合 1) "zhangsan" 2) "zhangsan" 3) "wangwu" 4) "lisi" 5) "zhangsan" 127.0.0.1:7000> lrem name 0 zhangsan 0-表示移除name集合中所有的zhangsan (integer) 3 127.0.0.1:7000> lrange name 0 -1 查看name集合 1) "wangwu" 2) "lisi" 127.0.0.1:7000> lset name 0 zhangsan 修改name集合中角标为0的元素的值 OK 127.0.0.1:7000> lrange name 0 -1 查看name集合中的所有元素 1) "zhangsan" 2) "lisi" 127.0.0.1:7000> rpushx age 1 如果age集合存在,则从右边放入一个值 (integer) 0 执行结果为0,发现没有存入 127.0.0.1:7000> rpushx name zhaoliu 如果name集合存在,则从右边放入一个值 (integer) 3
应用场景
1.消息队列,list集合可以实现先进先出的功能,可以用来做消息队列。
2.记录消息的先后数据,也是队列的数据结构。
HASH
127.0.0.1:7000> hset user:1 name lisi 设置user:1 的name为lisi (integer) 1 127.0.0.1:7000> hget user:1 name 获得user:1的name值 "lisi" 127.0.0.1:7000> hmset user:1 age 22 gender man hobby java 批量设置user:1的值 OK 127.0.0.1:7000> hmget user:1 name age gender hobby 批量获取 1) "lisi" 2) "22" 3) "man" 4) "java" 127.0.0.1:7000> hsetnx user:1 name zhangsan 如果user:1 的name值不存在则设置为zhangsan (integer) 0 127.0.0.1:7000> hget user:1 name 获得name的值,发现没有设置成功 "lisi" 127.0.0.1:7000> hincrby user:1 age -2 对user:1中的age进行加法操作 (integer) 20 127.0.0.1:7000> hgetall user:1 获得user:1的全部值 1) "name" 2) "lisi" 3) "age" 4) "20" 5) "gender" 6) "man" 7) "hobby" 8) "java"
应用场景
1.用来存放用户的信息,user:1可以用来作为id为1的user对象,里面的各个key为他的属性,value为他的值。这样的好处可以解决两个弊端:
(1)如果用String类型来存贮,将user整个序列化来进行存贮,则读取的使用又要反序列化浪费性能。如果高并发来进行修改时,还会出现问题,虽然redis是原子性的,但是序列化和反序列并不是在redis中进行的操作。
(2)如果用用户+属性名的拼接来进行String类型的存贮,虽然可以避免高并发下的修改问题,但是如果一个用户有很多属性,就要创建大量的key,这样又会造成大量的内存占用,造成性能低下。
hash类型的出现,很好的解决了上面的两种问题。
Set
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
127.0.0.1:7000> sadd name zhangsan 在name集合中添加zhangsan (integer) 1 127.0.0.1:7000> sadd name lisi wangwu 批量添加lisi wangwu (integer) 2 127.0.0.1:7000> smembers name 获取name集合中的全部值 1) "wangwu" 2) "zhangsan" 3) "lisi" 127.0.0.1:7000> sadd name zhangsan 向name集合中添加已经存在的值zhangsan (integer) 0 结果为0,添加失败 127.0.0.1:7000> smembers name 获取name集合中的全部值 1) "wangwu" 2) "zhangsan" 3) "lisi" 127.0.0.1:7000> scard name 获取name中的成员数 (integer) 3 127.0.0.1:7000> sadd name2 lisi 创建一个name2的集合 (integer) 1 127.0.0.1:7000> sdiff name name2 返回name与name2中的不同 1) "zhangsan" 2) "wangwu" 127.0.0.1:7000> sdiffstore difname name name2 将name与name2的不同存放到difname中 (integer) 2 127.0.0.1:7000> smembers difname 获取difname中的值 1) "zhangsan" 2) "wangwu" 127.0.0.1:7000> spop name 移除并返回name中的随机一个元素 "lisi" 127.0.0.1:7000> smembers name 1) "wangwu" 2) "zhangsan" 127.0.0.1:7000> srandmember name 随机返回name中的一个元素 "zhangsan" 127.0.0.1:7000> srandmember name 随机返回name中的一个元素 "wangwu" 127.0.0.1:7000> srandmember name 2 随机返回name中的两个元素 1) "zhangsan" 2) "wangwu" 127.0.0.1:7000> srem name lisi 移除name中的lisi (integer) 0 127.0.0.1:7000> srem name wangwu zhangsan 移除name中的wangwu和zhangsan (integer) 2