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的命令都是原子性的,可以轻松地利用 incrdecr 命令来构建计数器系统。

> Uniq 操作。redisset 数据结构自动去重,不断地将数据往 set 中扔就行了。 

> 网站访问统计等。利用 redis 的  HyperLogLog 高效的实现访问统计。

> 实时消息系统。Redis Pub/Sub 系统可以构建实时的消息系统。

> 队列系统。使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队列系统。

posted @ 2018-02-26 18:18  JMCui  阅读(439)  评论(0编辑  收藏  举报