一、Redis基础数据结构
string (字符串)、list (列表)、set (集合)、hash (哈 希) 和 zset (有序集合)
1、String
String一个常见的用途就是缓存用户信息。将用户信息结构体用JSON序列化成字符串,然后将序列化后的字符串塞进Redis来缓存。
Redis的字符串是动态字符串,内部结构类似于ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。
当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。
需要注意的是字符串最大长度为 512M。
键值对
127.0.0.1:6379[1]> set name Bob OK 127.0.0.1:6379[1]> get name "Bob" 127.0.0.1:6379[1]> append name 666 (integer) 6 127.0.0.1:6379[1]> get name "Bob666" 127.0.0.1:6379[1]> strlen name (integer) 6 127.0.0.1:6379[1]> getrange name 0 -1 //获取指定范围内的值 "Bob666"
过期和set命令拓展
127.0.0.1:6379[1]> set name Tom OK 127.0.0.1:6379[1]> get name "Tom" 127.0.0.1:6379[1]> expire name 5 //5s后过期 (integer) 1 127.0.0.1:6379[1]> get name "Tom" 127.0.0.1:6379[1]> get name (nil) //已过期 127.0.0.1:6379[1]> setex name 5 Jimmy //5s后过期,等价于set+expire OK 127.0.0.1:6379[1]> get name "Jimmy" 127.0.0.1:6379[1]> get name (nil) 127.0.0.1:6379[1]> setnx name Hanhan //如果name不存在就执行set创建 (integer) 1 127.0.0.1:6379[1]> get name "Hanhan" 127.0.0.1:6379[1]> setnx name Hanhan //name已存在,则创建失败 (integer) 0 127.0.0.1:6379[1]> get name "Hanhan"
2、List
Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为O(n)
右边进左边出:队列
127.0.0.1:6379[1]> rpush phone xiaomi huawei iphone vivo meizu (integer) 5 127.0.0.1:6379[1]> llen phone (integer) 5 127.0.0.1:6379[1]> lrange phone 0 -1 1) "xiaomi" 2) "huawei" 3) "iphone" 4) "vivo" 5) "meizu" 127.0.0.1:6379[1]> lpop phone "xiaomi" 127.0.0.1:6379[1]> lrange phone 0 -1 1) "huawei" 2) "iphone" 3) "vivo" 4) "meizu"
左边进右边出:栈
127.0.0.1:6379[1]> lpush food rice banana apple orange (integer) 4 127.0.0.1:6379[1]> lrange food 0 -1 1) "orange" 2) "apple" 3) "banana" 4) "rice" 127.0.0.1:6379[1]> lpop food "orange" 127.0.0.1:6379[1]> lrange food 0 -1 1) "apple" 2) "banana" 3) "rice" 127.0.0.1:6379[1]> rpop food "rice" 127.0.0.1:6379[1]> lrange food 0 -1 1) "apple" 2) "banana"