Redis学习一(概要).
一、简介
Redis是一个开源的使用 ANSI C语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、key-Value 的数据库、并提供多种语言的API。
Redis是一个运行在内存中的数据结构服务器(data structures server)。Redis使用的是单进程(除持久化时),所以在配置时,一个实例只会用到一个CPU。
通常,Redis 将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:RDB(默认) 和 AOF 。
Redis 为什么选用 6379 作为默认端口?因为 6379 在手机按键上 MERZ 对应的号码,而 MERZ 取自意大利歌女Alessia Merz的名字。
二、特点
- 支持数据的持久化,可以将内存中的数据保存到磁盘中,重启的时候可以再次加载进行使用。
- 丰富的数据类型存储:string、list、set、zset、hash。
- 支持数据的备份,即 master-slave 模式的数据的备份。
- 性能极高 – Redis 读的速度是110000次/s,写的速度是81000次/s。
- 所有的操作都是基于原子性的,因为 Redis 是单线程的。
三、安装
1、Window
-- 服务端
1、window下载地址:https://github.com/MicrosoftArchive/redis/releases
2、打开一个 cmd 窗口,使用 cd 命令切换目录 E:\redis 运行:redis-server.exe redis.windows.conf
-- 客户端
1、打开一个 cmd 窗口,使用 cd 命令切换目录 E:\redis 运行:redis-cli.exe -h 127.0.0.1 -p 6379 -a 'mypassword'
2、set myKey abc / get myKey
2、Linux
--服务端
#1> yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl #2>
wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxvf redis-4.0.14.tar.gz cd redis-4.0.14 #3>
make
cd src
make install prefix=/usr/local/redis
cd ../ cp redis.conf /usr/local/redis/ #4> cd /usr/local/redis/bin ./redis-server ../redis.conf
--客户端
#1> cd /usr/local/redis/bin #2> ./redis-cli #3> redis> set foo bar OK redis> get foo "bar"
四、值数据类型
- string
-- Redis 的 string 可以包含任何数据,比如 jpg 图片或者序列后的对象,一个 key 最大能存储512MB,但是大字符串非常不建议。
- hash
-- hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。每个 hash 可以存储 2^32-1 键值对 。
- list
-- list 是简单的 string 列表,按照插入的顺序可以在列表的头部(左边)或者尾部(右边)添加元素。
- set
-- set 是 string 类型的无序集合。集合是通过hash表实现的,所以。添加、删除、查找的复杂度都是O(1)。
- zset
-- zset 和 set 一样也是 string 的类型元素的集合,且不允许重复的队员,不同的是每个元素都会关联一个 double 类型的 score。redis 正是通过 score 来为集合中的成员进行从小到大的排序。分数(score)可以重复。添加元素到集合,元素在集合中存在则对应更新相应的 score。
五、设计规范
> key 命名规范:用 ":" 分隔域,用 "." 作为单词间的连接,如 " order:id:2:price "。不推荐含义不清的 key 和特别长的 key。
1. 第1段把表名转换为key前缀,如:order
2. 第2段放置用于区分区key的字段,对应 mysql 中的主键的列名,如:id
3. 第3段放置主键值,如:2,3,4....
4. 第4段写要存储的列名,如:price
> 只要有可能的话,就尽量使用散列键而不是字符串键来储存键值对数据,因为散列键管理方便、能够避免键名冲突、并且还能够节约内存。
> 如果将 redis 作为 cache 进行频繁读写和超时删除等,此时应该避免设置较大的 k-v(尽可能使用不要超过 1M 大小的 kv),因为这样会导致 redis 的 内存碎片增加,导致 rss 占用较大,最后被操作系统 OOM killer 干掉。
> 尽可能使用批量操作:
- mget、hmget而不是 get 和 hget,对于set也是如此
- lpush 向一个 list 一次性导入多个元素,而不用 lset 一个个添加
- lrange 一次取出一个范围的元素,也不用 lindex 一个个取出
- 尽可能使用 pipeline 操作
六、典型使用场景
> 缓存。高频次数据优先访问 redis,redis 没有找到再访问数据库。
> 排行榜。利用 zset 的 score 功能,维护多个维度的数据排行。
> 计数器。redis的命令都是原子性的,可以轻松地利用 incr,decr 命令来构建计数器系统。
> Uniq 操作。redis的 set 数据结构自动去重,不断地将数据往 set 中扔就行了。
> 网站访问统计等。利用 redis 的 HyperLogLog 高效的实现访问统计。
> 实时消息系统。Redis 的 Pub/Sub 系统可以构建实时的消息系统。
> 队列系统。使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。