Redis 简介
Redis中的两种持久化方式:半持久化、全持久化
查看默认安装目录
Redis-benchmark:性能测试工具,可以在自己本子上运行,看看自己本子性能如何(服务启动起来后执行)
Redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
Redis-check-dump 修复有问题的dump.rdb文件
Redis-sentinel(哨兵) Redis集群使用
Redis-server Redis服务器启动命令
Redis-cli 操作入口
检查Redis连接是否成功
输入PING 返回PONG
关闭客户端可以输入exit或者ctrl+c
同时关闭客户端和服务器端可在客户端使用shutdown命令
只关闭服务器端可以在客户端使用Redis-cli shutdown命令
Redis单线程及多路IO复用
Redis 默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令select <dbid>来切换数据库 如:select 8
统一密码管理:
所有库都是同样的密码,要么都OK要么一个也连不上(类似事务的原子性)
Redis单线程及多路IO复用
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数
传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后
进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
案例分析:
串行vs多线程+锁(memcached)vs 单线程+多路IO复用(Redis)
Redis的数据类型
String
Set
key+List
Hash
Zset(有序的)
常用命令
查看当前数据库里所有的键:keys *
判断当前数据库是否有这个键:exists xxx
查看当前数据库中这个键的类型:type xxx
在当前数据库中删除某个键:del xxx
设置当前数据库中的某个的键值对的过期时间,单位为秒 exprie aaa 10 (键名为a的键值对10秒过期)
查看当前数据库中的某个键值对还有多少秒过期(-1 代表永不过期 -2 代表已过期) ttl xxx
查看当前数据库的key的数量 dbsize
清空当前库 Flushdb
通杀全部库 Flushall
String类型
String是Redis最基本的类型,可以理解为与Memcached一模一样的类型,一个key对应一个value
String类型是二进制安全的,意味着Redis的String可以包含任何数据,比如jpg图片或者序列化对象
String类型是Redis最基本的类型,一个Redis中字符串value最多可以是512M
String基本指令
get xxx 根据键名获取键值
set key value 添加键值对
append key value 将给定的value追加到原值的末尾
strlen key 获取值的长度
setnx key value 只有在Key不存在时设置key的值
incr key 将key中存储的数字值增1,只能对数字值操作,如果为空,新增值为1 原子性
decr key 将key中储存的数字值减1 原子性
incrby/decrby key 步长 将key中储存的数字增减,自定义步长 原子性
mset key1 value1 key2 value2.... 同时设置一个或多个key-value对
mget key1 value1 key2 value2.... 同时设获取一个或多个key-value对
msetnx key1 value1 key2 value2 同时设置一个或多个key-value对(仅当所有给定key都不存在的情况下)
getrange key 起始位置 结束位置 获得值得范围,类似于java中的subString(java中的subString包前不包后,redis中的getrange包前也包后)
setrange key 起始位置 value 用value覆盖key中所储存的字符串值,从起始位置开始
setex key 过期时间 value 设置键值对的同时设置过期时间,单位为秒
getset key value 设置新值且同时获得旧值
Redis中的原子性
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会任何context swith(切换到另一个线程)
1 在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间
2 在多线程中,不能被其他进程(线程)打断的操作就是原子操作
Redis单命令的原子性主要得益于Redis的单线程
思考:
C++和java中的i++是否是原子操作?(非原子操作,因为i++分为三步,取出i,放到寄存器,i+1,再存入,其中可以被打断)
List
单键多值
Redis里列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到表的头部(左边)或者尾部(右边)
它的底层是双向链表实现的,对两端操作性能很高,通过索引下表操作中间的节点性能会较差
基本命令
lpush/rpush key value1 value2 从左边或右边插入一个或多个值
lpop/rpop key 从左边或右边弹出一个值,值在键在,值光键亡
rpoplpush key1 key2 从key1列表的右边吐出一个值,插到Key2列表左边
lrange key start stop 根据索引下标获得元素(从左到右)
lindex key index 根据索引下标获得元素(从左到右)
llen key 获得列表长度
linsert key before/after value newvalue 在value的前面/后面插入newvalue
lrem key n value 从左边删除n个value(从左到右)(这里的n可以为0(代表全删除) 可以为正整数(代表从左往右删除,即上面删) 可以为负整数(从右向左删除,即下面删))
Set
Redis Set对外提供的功能与List类似是一个列表的功能,特殊之处在于set可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这也是List所没有的
Redis的Set是String类型的无序集合,它底层其实是一个value为null的hash(key为set的值,value为null)表,所以添加,删除,查找的复杂度都是O(1)
常用命令
sadd key value1 value2 将一个或多个member元素加入到集合key当中,如果当前集合已存在这个元素,则会被忽略。
smember key 取出该集合所有的值
sismember 判断集合key是否含有该value值,如果有返回1,没有返回0
Smove key1 key2 member 将key1集合中的member元素移动到key2集合中,smove是原子性操作,要么一起成功要么一起失败
scard key 返回该集合元素的个数
srem key value value 删除集合中的某个元素
spop key 随机从集合中弹出一个值
srandmember key n 随机从集合中取出n个值,但不会从集合中删除
sinter key1 key2 返回两个集合的交集元素
sunion key1 key2 返回两个集合的并集元素
sdiff key1 key2 返回两个集合的差集元素
Hash
Redis hash是一个键值对集合
Redis hash是一个string类型的field和value的映射表
hash特别适合用于存储对象
类型java里面的Map<String,String>
hset key field value 给key集合中的field键赋值value
hget key1 field 从key1集合field取出value
hmset key1 field1 value1 field2 value2 批量设置hash的值
hexists key filed 查看哈希表key中,给定域field是否存放
hkeys key 列出该hash集合的所有field
hvals key 列出该hash集合的所有value
hincrby key field increment 为哈希表key中的域field的值加上增量increment
hsetnx key field value 将哈希表key中的域的值设置为value,当且仅当域field不存在
hgetall xxx 显示该哈希表所有的field value
注意
在启动时
redis-cli --raw 加入--raw可以解决中文乱码
ZSet
Redis有序集合Zset与普通集合set非常相似,是一个没与重复元素的字符串集合,不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员,集合成员是唯一,但评分可以重复