一、Redis简介
1.redis是美国Vmware公司开源的NoSQL数据库产品,基于Key-Value存储格式,可将数据保存在内存或者硬盘中
2.Redis是单线程模型的NoSQL数据库,由C语言编写,官方提供的数据可以达到100000+的QPS(每秒内查询的次数)
二、Redis的安装
- Redis 的官方网站只提供了 Linux 系统的对应的 Redis 程序,并没有 Windows 平台的安装文件。
- Windows 平台环境安装(解压即可使用):redis-windows/downloads at master · ServiceStack/redis-windows · GitHub
- redis图形客户端 RedisDesktopManager
2.1 redis的持久化
为了防止意外宕机丢失数据,redis提供了两种持久化的方式
RDB AOF
2.2 redis常用参数
三、redis的数据类型
3.1 redis字符串类型
String 类型既可以保存普通的文字,也可以保存序列化的二进制数据
String 类型最大可以存储 512M 数据
set email sccot@111.com //设置字符串键和值
get email //获取String类型
del email //删除
字符串指令(一)
getrange email 0 3 //获取截取的字符串内容
strlen email //获取字符串长度
setex city 5 beijing //设置过期时间的key-value
字符串指令(二)
mset username sccot sex male //设置多个KEY-VALUE
mget username sex //获取多个KEY-VALUE
字符串指令(三)
append: 用在字符串结尾追加内容
字符串指令(四)
incr num //数字自增加1
incrby num 20 //数字加上指定的整数值
incrbyfloat num 3.5 //数字加上浮点数
字符串指令(五)
decr num //数字自减1
decrby num 20 //数字减去指定的整数值
字符串指令(六)
flushall 清除数据库
3.2 redis哈希类型
“哈希类型” 比较容易理解,它与 Python 中的字典结构比较类似,也是 key:value 这种数据结构的,相当于是在 redis 的 value 里面再定义了一次 key:value 这种数据结构
哈希指令(一)
HSET 命令:设置 "哈希表" 字段,可以多次执行,写入多个字段
HMSET 命令:设置 "哈希表" 多个字段,可以一次性执行,写入多个字段
hset 8000 ename Tom //设置哈希字段
hset 8000 job SALESMAN
hmset 8000 ename Tom job SALESMAN deptno 10 //设置多个哈希字段
哈希指令(二)
hget:获取哈希表字段值
hget 8000 ename
hmget:获取多个哈希表字段值
hmget 8000 ename job deptno
hgetall:获取哈希表所有字段值
hgetall 8000
哈希指令(三)
hkeys 8000 //获取所有哈希表字段名
hlen 8000 //哈希表中字段数量
hexists 8000 job //判断哈希表是否存在某个字段
哈希指令(四)
hvals:获取哈希表所有字段值
hvals 8000
hdel:删除哈希表字段
hdel 8000
哈希指令(五)
哈希加法运算(加法把值改成负数)
hincrby:让哈希表某个字段加上指定的整数值
hincrby 8000deptno 10
hincrbyfloat:让哈希表某个字段加上指定的浮点数
hincrbyfloat 8000 sal 350.5
3.3 redis列表类型
而当我们需要向 VALUE 中保存序列化的数据时,就可以使用 列表类型
rpush | 向 列表 的右侧添加元素 |
lpush | 向 列表 的左侧添加元素 |
lset | 修改 列表 中某个元素的值;(利用索引位) |
lrange | 获取 列表 中所有的元素 |
rpush dname 技术部 质检部 人事部 财务部
lpush dname 秘书处
lset dname 2 销售部
lrange dname 0 -1
列表指令(一)
llen dname //获取列表长度
lindex dname 0 //获取列表某个元素
linsert dname before 秘书处 董事会 //在列表某个位置插入元素
列表指令(二)
命令 | 功能 |
---|---|
lpop | 删除 列表 最左侧的元素 |
rpop | 删除 列表 最右侧的元素 |
lrem | 删除 列表 中某个元素 |
lrem dname 1 scoot //删除的是列表中的第一个sccot 1 并不是索引
3.4 redis集合类型
- 在我们使用 “列表类型” 时,是可以向 “列表” 中存储相同的元素的。
- 当我们希望 “元素” 不重复的时候,就可以使用 “集合类型” 了。
添加获取元素
命令 | 功能 |
---|---|
sadd | 向 集合 内添加元素 |
smembers | 获取 集合 内所有的元素 |
sadd empno 9000 //可以单个增加
sadd empno 9001
sadd empno 9002
sadd emptno 9001 9002 9003 //可以一次增加多个
smembers emptno //获取集合内所有元素
集合指令(一)
scard emptno //获取集合长度
sismember emptno 9000 //判断是否含有某个元素
srem emptno 9000 9001 //删除元素
del emptno //删除记录
集合指令(二)
命令 | 功能 |
---|---|
spop | 随机删除 集合 内某个元素,并返回该元素的值 |
srandmember | 随机返回 集合 内指定数量的元素 |
spop enptno
srandmember empno 5
3.5 redis有序结合类型
有序集合是带有排序功能的集合,它继承了集合的特点,不能有重复的元素,因为有排名次序的存在,所以有序集合中的元素是有索引存在
有序集合指令(一)
有序集合是带有排序功能的集合,redis会按照元素分数值排序
命令 | 功能 |
---|---|
zadd | 定义一个有序集合;并向有序集合中添加元素 |
zadd keyword 0 'v1' 0 'v2' 0 'v3'
命令 | 功能 |
---|---|
zincrby | 增加元素分数值 |
zincrby keyword 1 'v1'
zincrby keyword 5 'v1'
命令 | 功能 |
---|---|
zrevrange | 提取有序集合中所有的元素,以降序的方式排列 |
zrevrange keyword 0 -1
有序集合指令(二)
zcard:获得有序集合长度
zcard keyword
zcount :查询某个分数值区间的元素数量
zcount keyword 5 10
zscore : 返回元素的分数值
zscore keyword 'v1'
有序集合指令(三)
zrange:获得有序集合的内容(升序)
zrange keyword 0 -1
有序集合指令(四)
zrangebyscore:获得分数值区间内的集合内容(升序)
zrangebyscore keyeword 5 10 //查询分数值为5到10之间
zrangebyscore keyeword 5 (10 //大于5小于10 分数值
zrangebyscore keyeword 10000 +inf //分数值在10000以上的有哪些
zrevrangebyscore:获得分数值区间内的集合内容(降序)
zrevrangebyscore keyword 10 5 //分数值在5到10之间的集合内容降序排,最大值写前面
有序集合指令(五)
zrank:获得元素的升序排名(从0开始)
zrank keyword 'v1'
zrevrank:获得元素的降序排名(从0开始)
zrank keyword 'v1'
有序集合指令(五)
zrem:删除有序集合中的元素
zrem keyword 'v1' v2'
zremrangebyrank:删除排名区间内的元素
zremrangebyrank keyword 0 2 //删除排名前两位的
aremrangebyscore:删除分数值区间内的元素
zremrangebyscore keyword -inf (5000 //删除分数值为5000以下的,负无穷到5000
四、redis的key命令
del删除记录
del keyword
exists:判断是否存在某个key
exists key //存在返回1,不存在返回0
expire:设置记录过期时间
expire key 5 //5秒钟后记录删除
pexpire:设置过期时间(毫秒)
pexpire keyword 5000
key命令(二)
expireat:设置记录的过期时间(UNIX时间戳)
expireat ename 1544803200
move:把记录迁移到其他逻辑库
move keyword 1
rename :修改key名称
rename ename emp
key命令(三)
persist:移除过程时间
persist keyword
type:用来判断value数据类型
type keyword
五、redis的事务机制
1.数据库引入事务机制是为了防止对数据文件直接操作的时候出现意外宕机,引发数据的错乱
2.undo和redo日志保证的业务操作的原子性
既然 “redis” 不具备 “undo” 与 “redo” 两种日志文件的存在,也就不具备了业务操作的 “原子性” ,那么 “redis” 的事务机制是用来做什么的呢?
“redis” 的事务机制被设计出来的目的其实是为了防止并发执行的时候,被其他操作插队用的。
“redis” 是异步单线程执行的,也就是一个线程对应所有的客户端。任何一个客户端发起了执行的命令,“redis” 就会执行。而不是说单线程对应了一个客户端,从头到尾只执行这一个客户端的命令;等到这个客户端执行完毕之后才会执行下一个客户端的命令,“redis” 的单线程并不是这样去执行的!而是当任何一个客户端上传了执行命令,“redis” 都会执行。
5.1 redis事务的特点
- “redis” 与 “MySQL” 的 “ACID” 属性的区别,见下方表格:
序号 | 属性 | Redis | MySQL |
---|---|---|---|
1 | 原子性 | NO | YES |
2 | 一致性 | YES | YES |
3 | 隔离性 | YES | YES |
4 | 持久性 | NO | YES |
5.2 保证数据的一致性
为了保证事务的一致性,在开启事务之前必须要用watch命令监视要操作的记录
watch kill_num kill_user
5.3 如何开启事务
利用 multi 命令可以开启一个事务
multi
开启事务后所有的操作都不会立即执行,只有执行exec命令的时候才会批处理执行
incr kill_num // kill_num增加1
rpush kill_user 9999
exec //提交redis批处理执行,不提交上面的不会执行
5.4 事务取消
redis没有事务的回滚机制,所以不能保证原子性
事务在没有提交执行前,是可以取消事务的,如果事务已经提交执行,就无法取消了
multi
...
discard //取消事务
redis命令文档
http://doc.redisfans.com/index.html