Redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API.
非结构化的, 非关联的.
数据结构相对固定, 相关业务对数据的安全性, 一致性要求较高. - 关系型数据库(MySQL) 事务很强大.
数据结构不固定, 对一致性,安全性要求不高, 对性能有要求. - 非关系型数据库(redis)
http://www.redis.cn/commands.html
MySQL表
主键 | 姓名 | 年龄 | 性别 |
---|---|---|---|
1 | 张三 | 15 | 男 |
2 | 璐璐 | 18 | 女 |
3 | 李四 | 20 | 男 |
redis
1: {name: 张三, age: 15, gender: 男}
2: {name: 璐璐, age: 18, gender: 女}
3: {name: 李四, age: 20, gender: 男}
redis特点.
- key-value型, value支持多种不同的数据结构, 功能比较丰富.
- 核心命令执行是单线程的. 每个命令都具有原子性. 6.0以后加入的多线程只是用来处理网络数据和协议.
- 基于内存, 低延迟, 效率高.
- 基于内存, 也支持数据持久化.
- 支持集群.
redis支持的数据结构.
数据类型 | 说明 |
---|---|
string | hello |
hash | {name: 李四, age: 20, gender: 男} |
set | {1, 2, 3} |
list | [1, 2, 3, 4] |
SortedSet | {a:1, b:2,c:3} score |
redis通用命令.
- keys: 查看所有匹配给定的模式的key.
- exists: 判断key是否存在.
- expire: 给一个key设置有效期, 有效期到期该key会被删除.
- ttl: 查看一个key的剩余有效期.
- del: 删除一个指定的key.
- randomkey: 随机获取一个key.
- auth 密码 : 登录redis
string类型.
字符串类型, 即使是字符串, 但是根据字符串类型的不同, 也可以做出区分.
- 普通字符串.
- int. 整型.
- float: 浮点型.
一个string类型最大是5 12M.
redis的key的长度最好不要超过44(39)
string类型常用命令.
命令 | 说明 |
---|---|
set | 添加或修改已经存在的一个string的键值对. |
get | 根据key获取string类型的value. |
mset | 批量添加string的键值对. |
mget | 根据多个key获取多个string类型的value. |
incr | 让一个整型的value自增1. |
incrby | 让一个整型的value自增并指定步长. |
decr | 让一个整型的value自减1. |
incrbyfloat | 让一个浮点型自增并指定步长. |
setnx | 添加一个不存在的string的键值对, 存在则不执行. |
setex | 添加一个string键值对, 并且指定有效期. |
append | 追加一个值到一个key上. |
strlen | 获取指定key的值的长度. |
key的层级结构.
如果你插入的key重复了怎么办. 比如一个学校一班跟二班都有一个名叫zhangwei的. 他们的学号都是1.
1: {name: zhangwei, age: 17}
1: {name: zhangwei, age: 18}set school:class1:1 ‘{name: “zhangwei”, age: 17}’
set school:class2:1 ‘{name: “zhangwei”, age: 18}’
hash类型.
hash类型, 它的value实际上是一个字典.
在上面的实例中, {name: “zhangwei”, age: 17}存到redis里实际上是存的一个字符串, 当你要修改里面字段的值的时候, 你只能去做 覆盖.
hash可以将字典中的每个字段单独存储, 可以只针对单个字段做增删改查.
例如:
key | 字段 | 值 |
---|---|---|
school:class1:1 | name | zhangwei |
age | 17 | |
school:class2:1 | name | zhangwei |
age | 18 |
hash常用命令.
命令 | 说明 |
---|---|
hset(key, 字段, 值) | 设置hash字段的值. |
hget(key, 字段) | 获取hash字段的值. |
hmset | 批量添加hash字段的值. |
hmget | 批量获取hash字段的值. |
hgetall | 获取一个hash中的key的所有的字段和值. |
hkeys | 获取 一个hash中key的所有的字段. |
hvals | 获取一个hash中key的所有值. |
hincrby | 让一个key的字段值自增指定步长. |
hsetnx | 添加一个hash中key的值,当这个字段不存在,否则不添加. |
hlen | 获取hash里字段的数量. |
hexists | 判断hash中的key是否存在某字段. |
list常用命令
有序的, 元素可重复, 插入删除快.
栈: 先进后出.
队列: 先进先出.
命令 | 说明 |
---|---|
lpush | 向列表的左侧插入一个或多个元素 |
lpop | 移除并返回列表左侧的第一个元素, 没有返回nil |
rpush | 向列表的右侧插入一个或多个元素 |
rpop | 移除并返回列表右侧的第一个元素 |
lrange | 返回一段索引(下标, index)范围内的所有元素 |
blpop | 移除返回列表左侧的第一个元素, 没有则阻塞 |
brpop | 移除返回列表右侧的第一个元素,没有则阻塞 |
lindex | 通过列表的索引获取一个元素 |
llen | 获取列表的长度 |
set常用命令
无序的, 元素不可重复, 查找快.
支持多集合交集, 并集查询.
命令 | 说明 |
---|---|
sadd | 向一个集合中添加一个或多个元素 |
srem | 删除集合中的元素 |
spop | 删除并获得集合中的一个元素 |
scard | 查询集合中元素的个数 |
sismember | 判断一个元素是否存在于集合中 |
smembers | 获取集合中的所有元素 |
srandmember | 随机获取集合中的元素 |
sinter | 获取key1与key2的交集 |
sdiff | 获取key1与key2的差集 |
sunion | 获取key1与key2的并集 |
SortedSet 有序集合常用命令
可排序的集合, 有序集合中的每一个元素都带有一个score属性.
可排序, 元素不重复, 查询速度快.
默认是升序, 如果要降序, 就要在命令前面加上rev
命令 | 说明 |
---|---|
zadd(key, score, member) | 添加一个或多个元素, 已存在则更新score值 |
zrem(key,member) | 删除一个指定的元素 |
zscore(key, member) | 获取指定元素的score值 |
zrank(key, member) | 获取指定元素的排名 |
zcard(key) | 统计元素的个数 |
zcount(key, min, max) | 统计score值在给定范围内的元素个数 |
zrange(key, min, max) | 按score排序, 获取指定排名范围内的元素 |
zrangebyscore(key, min, max) | 按score排序, 获取指定score范围内的元素 |
zincrby(key, incr, member) | 指定元素自增 |
创建一个学生的有序集合, 插入以下数据.
zhang: 90, wang: 81. li: 70, zhou: 60, zhao:78, yang: 53, sun: 85
- 删除yang同学.
- 获取zhou的分数.
- 获取wang的排名.
- 查询80分以下的有几个学生.
- 给zhao同学加2分.
- 查出成绩前3名的同学.
- 查出80分以上的所有同学.