简介
youtube教程
菜鸟教程
NOsql的key-value数据库
可基于内存亦可持久化
日志型数据库
遵守BSD协议,开源免费
由C语言编写
分布式的基于内存的
缓存工具
关系型数据库和非 的区别:表与表之间建立关联关系;
非~的分类:
- key-value
- Redis, Oracle BDB
- 列存储数据库
- 通常用于分布式存储的海量数据,键依然存在,但特点是 指向了多个列。这些列是由家族来安排的。如HBase
- 文档行数据库
- MongoDb. 比键值数据库的查询效率更高
- 图形数据库
- Neo4J
非~在一下情况更适用
- 数据模型简单
- 需要灵活性更强的IT系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定key比较容易映射复杂值的环境
关系型数据库的执行流程:
select * from usersTable
- 解析字符串 select ….
- 将字符串转换成对象
- 经过大量算法在硬盘中查询操作
- 展示在控制台
而redis这种key-value数据库直接通过key查询value
redis特点
- 支持数据持久化,可以将内存中数据保存在磁盘,重启时可以再次加载
- 不仅支持简单的key-value的类型,同时提供list, set,zset,hash, ordered Set等数据结构的存储
- 支持数据备份,集群等高可用功能
- redis的所有操作都是原子性的,要么成功执行要么失败完全不执行。多个操作也支持事务,即原子性,通过multi和exec指令包起来
- 支持publish/subscribe,通知,key expire等
- 单个key存入512M大小
- 支持多种类型数据结构 string,list,hash,set,zset
- 单线程 原子性
- 可以持久化,因为使用了RDB和AOF机制
- 支持集群,支持16个库
- 可以做消息队列,比如聊天室IM
缺点
- 耗内存,占用内存过高
- 因为持久化,实现的两种方式:
- 定时快照(snapshot)每次都是写全部数据,代价较高
- 基于语句追加(aof)只追踪变化的数据,但是追加的log可能过大,同时
redis config 配置
常用命令
- del key
- Keys (pattern)
- Keys * 星代表所有
- keys xx? 问号表示一个字符
- Dump key
- Exists key: check a key is exist
- Expire key seconds : set a key expire time,常用业务场景是:限时的优惠活动信息,网站数据缓存比如排行榜按天更新,手机验证码,网站限制访客访问频率
- pexpire key millseconds:
- ttl key: check key expire time, -1时永久,-2是不存在(已过期
- Pttl key :以毫秒为单位
- persist key : 移除key的过期时间
- rename key newName
- move key db
- type key 返回key的值 的数据类型
key的命名规范
- key不要超过1024字节
- 一个项目中,key最好使用统一模式,例如 user:123:passwordxx
- 命令 get /set 之类的不区分大小写,key区分大小写
数据类型
string
- 二进制数据安全,中间不用编码解码
- 一个key对应一个value,值可以是图片的二进制序列化
- string是redis最基本的数据类型,一个键key最多存储512M
相关命令
- set key xx,
- setnx key xx,只有key不存在的情况下设置key值,否则无效
- get key,如果key 不存在返回nil,如果key值存储的不是字符串类型,比如hash 就会返回一个错误
- getrange key startIndex endIndex, 根据下标截取字符串
- getset key xx,如果key存在就返回key旧值并赋值xx,如果key不存在就返回nil并赋值xx
- strlen key
- Del key
- incr key,将key中存储的数字值增加1.如果key不存在就被初始化为0并创建然后执行incr操作(即最初是1)
- decr key ,自减
- incrby key count,同上,将key中存储的数字值增加count量
- decrby key count
应用场景:
- 通常用于保存单个字符串或者json字符串数据
- string是二进制安全的,所以完全可以把图片文件的内容作为字符串来存储,保密性的图片
- 计数器,如微博数 粉丝数,incr等命令本身就具有原子操作的特性
hash
- 类似于object
相关命令
- hset key field field-value
- hget key field
- hmset key field1 field-value1 [field2 field-value2..]. 一次性赋值整个hash多个fields
- hmget key field1 [field2 …]
- hgetall key 返回key的整个hash值
- hkeys key 获取key的hash值中的所有fieldkey
- hlen key 获取hash表中字段fields的数量
- hdel key field1 [field2 …] 删除一个或多个hash字段,当所有字段都删除了就自动回收掉这个key
- del key
- hsetnx key field value 同setnx
- hincrby key field count 同incrby 对hash值中的某个field自增
- hincrbyfloat key field count 对hash值的中某个field值为浮点数值加
- hexists key field 查看hash值中指定字段field是否存在
应用场景
存储一个对象
hash是最接近关系型数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中
list列表
set集合
zset有序集合