一.Redis基础知识
1. 端口6379的由来
6379 = Merz
Merz全名Alessia Merz,是意大利的一位广告女郎。
2. 默认数据库
默认有16个数据库,且初始状态默认选择0号数据库(即第一个数据库)。
3.数据库切换
可以使用select 进行数据库切换。
select 8 切换到8号数据库
4.密码管理
统一密码管理,所有库密码都一致。
5.查看key数量
dbsize-查看当前数据库的key数量。
6.清空当前库
flushdb-清空当前库。
7.清空所有库
flushall-清空所有库。
8.Redis单线程
为什么Redis是单线程且效率极高:
1).绝大部分请求是纯粹的内存操作。
2).避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑。各种锁的问题,不存在加锁释放锁操作。
3).使用IO多路复用技术,可以处理并发的连接。
二、Redis数据类型
1 key键
1. keys * 查看当前库中所有的key 。
2. exists key 判断某个key是否存在。
可以设置多个key,只返回存在的个数,但不返回哪一个存在/不存在。
exists k1 查看k1是否存在,如果存在返回1 exists k1 k2 k3 查看k1 k2 k3是否存在,如果k1 k2存在,k3不存在,则返回2
3. move key db 将当前数据库的 key 移动到给定的数据库 db 当中。
move k1 8 将k1从当前数据库移动到8号库
4. type key 查看当前key 所储存的值的类型。
返回当前key所储存的值的类型,如string 、list等。
5. del key 删除已存在的key,不存在的 key 会被忽略。
可以设置多个key,返回删除成功的个数。
del k1 删除k1,如果成功返回1,失败返回0 del k1 k2 k3 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2
6. expire key time 给key设置time秒的过期时间。
设置成功返回 1 。 当 key 不存在返回 0。
expire k1 10 给k1设置10秒后过期
7. ttl key 以秒为单位返回 key 的剩余过期时间。
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单
位,返回 key 的剩余生存时间。
8. persist key 移除给定 key 的过期时间,使得 key 永不过期。
当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
2 五大数据类型-String(字符串)
2.1 简介
String是Redis最基本的类型,一个key对应一个value。
String是二进制安全的,意味着String可以包含任何数据,比如序列化对象或者一张图片。
String最多可以放512M的数据。
2.2 常用命令
1. set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类
型。
set k1 v1 向Redis中设置一个k1的键值对 set k1 100 将k1的值由v1重置为100
2. get key 用于获取指定 key 的值。如果 key 不存在,返回 nil 。
3. append key value 将给定的value追加到key原值末尾。
如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。
append k1 v1 在Redis中不存在k1,所以直接设置k1的值为v1 append k1 v2 向k1的值末尾添加一个v2,最终结果为v1v2
4. strlen key 获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错
误。
5. setex key time value 给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命
令将会替换旧的值,并设置过期时间。
setex k1 10 v1 向Redis中设置一个k1的键值对并且10秒后过期
6. setnx key value当key不存在时,设置给定 key 的值。如果key存在,则没有任何影响。
setnx k1 v1 向Redis中设置一个k1的键值对 setnx k1 v2 Redis中存在k1,则没有影响,k1的值仍然为v1
7. incr key 将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。
incr k1 因为Redis中不存在k1,所以先初始化为0,再递增,值为1 incr k1 存在k1,递增后k1的值为2 set k2 v2 incr k2 因为k2不为数值,Redis返回一个错误
8. decr key将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。
decr k1 因为Redis中不存在k1,所以先初始化为0,再递增,值为-1 decr k1 存在k1,递增后k1的值为-2 set k2 v2 decr k2 因为k2不为数值,Redis返回一个错误
9. incrby/decrby key step 将key存储的数字值按照step进行增减。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。
如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。
10. mset key1 value1 key2 value2 ……同时设置一个或多个 key-value 。
mset k1 v1 k2 v2 k3 v3 同时向Redis中设置了k1 k2 k3
11. mget key1 key2 ……返回所有(一个或多个)给定 key 的值。
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
mget k1 k2 同时获取k1 k2
12. msetnx key1 value1 key2 value2 ……用于所有给定 key 都不存在时,同时设置一个或多个
key-value 。msetnx具有原子性特性,有一个失败,则都失败。
msetnx k1 v1 k2 v2 向Redis中设置k1 k2两个键值对 msetnx k1 v2 k3 v2 Redis中存在k1,k1设置失败,由于原子性特性,k3也设置失败
13. getrange key start end用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由
start 和 end 两个偏移量决定(包括 start 和 end 在内)。
set java helloworld 设置一个key为java,value为helloworld的值 getrange java 0 3 获取索引0-3的值,结果为hell
14. setrange key offset value用指定的字符串重写给定 key 所储存的字符串值,重写的位置从偏移量 offset 开始。
set java helloworld 设置一个key为java,value为helloworld的值 setrange java 5 baizhan 从偏移位置5(w)开始,用baizhan重写key
2.3 String底层数据结构
String底层数据结构是简单动态字符串(simple dynamic string,SDS)。
类似于JAVA中的ArrayList,采用预分配方式来减少内存的频繁分配。
如图,内存实际大小一般都要高于字符串实际大小。当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时每次只会多扩1M的空间。字符串最大长度为512M。
3 五大数据类型-List(列表)
3.1 简介
List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。
一个List最多可以包含 个元素 ( 每个列表超过40亿个元素)。
3.2 常用命令
1. lpush/ rpush key1 value1 value2 value3……从左边(头部)/右边(尾部)插入一个或多个
值。
lpush k1 v1 v2 v3 从左边放入v1 v2 v3
rpush k1 v4 v5 v6 从右边放入v4 v5 v6
2. lrange key start end返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示
列表的第一个元素,-1表示最后一个元素。
lrange k1 0 2 取出列表里前3个值,结果为v3 v2 v1 lrange k1 0 -1 取出列表里全部值,结果为v3 v2 v1 v4 v5 v6
3. lpop/rpop key移除并返回第一个值/最后一个值。
值在键在,值光键亡。
lpop k1 从列表中删除v3,并返回,当前列表全部值v2 v1 v4 v5 v6 rpop k1 从列表中删除v6,并返回,当前列表全部值v2 v1 v4 v5
4. lindex key index 获取列表index位置的值(从左开始)。
5. llen key获取列表长度。
6. lrem key count value从左边开始删除与value相同的count个元素。
lrem k1 2 v1 从左边开始删除k1列表中2个v1元素
7. linsert key before/after value newvalue 在列表中value值的前边/后边插入一个newvalue值
(从左开始)。
linsert k1 before v1 v5 在v1前面插入一个v5
8. lset key index value将索引为index的值设置为value
4 五大数据类型-Set(集合)
4.1 简介
与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。
Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。
一般来说,一个算法如果是O(1),随着数据增加,查找数据的时间不变。
集合中最大的成员数为 ( 每个集合超过40亿个元素)。
4.2 常用命令
1. sadd key value1 value2……将一个或多个元素添加到集合key中,已经存在的元素将被忽略。
sadd k1 v1 v2 v2 v3 v4 v5 v6向集合中添加值,最终只有v1 v2 v3 v4 v5 v6
2. smembers key取出该集合的所有元素。
smembers k1
3. sismember key value判断集合key中是否含有value元素,如有返回1,否则返回0。
sismember k1 v1
4. scard key返回该集合的元素个数。
scard k1
5. srem key value1 value2……删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。
srem k1 v1 v2 删除v1 v2
6. spop key随机删除集合中一个元素并返回该元素。
spop k1 随机删除一个元素,并返回
7. srandmember key count随机取出集合中count个元素,但不会删除。
srandmember k1 2 随机取出集合中的2个元素
8. smove sourcekey destinationkey value将value元素从sourcekey集合移动到destinationkey
集合中。如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回 0。
smove k1 k2 v5 将元素v5从集合k1中移动到集合k2
9. sinter key1 key2返回两个集合的交集元素。
10. sunion key1 key2返回两个集合的并集元素。
11. sdiff key1 key2返回两个集合的差集元素(key1中的,不包含key2)
sinter k1 k2 返回v3 sunion k1 k2 返回v1 v2 v3 v4 v5 sdiff k1 k2 返回v1 v2 sdiff k2 k1 返回v4 v5