Redis内存缓存学习

分类: 互联网 > 内存缓存
  1. 什么是Redis:

    1. Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

    2. 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

  2. Redis 简介:

    1. Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

    2. Redis 与其他 key - value 缓存产品有以下三个特点:

      1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

      2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

      3. Redis支持数据的备份,即master-slave模式的数据备份。

  3. Redis 优势:

    1. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。

    2. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

    3. 原子 – Redis的所有操作都是原子性(跟数据库事务一样原理)的,同时Redis还支持对几个操作全并后的原子性执行。

    4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

  4. 持久化存储方式:

    1. RDB持久化:

      1. 描述:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘(默认)

      2. 配置开启:save 900 1 | save 300 10 | save 60 10000

      3. 配置关闭:#save 900 1 | #save 300 10 | #save 60 10000

    2. AOF持久化:

      1. 描述:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

      2. 配置开启:appendonly yes

      3. 配置关闭:appendonly no

  5. 后台监控并统计执行操作:

    1. redis-cli monitor >mon.txt

    2. cat mon.txt |awk '{print $4" "$5}'|sort|uniq -c|sort -nr|less

  6. redis的应用:

    1. string是有sds和整数对象构成,常用作缓存,计数器,用户共享session、限流、秒杀去库存、二进制数据

    2. hash是有压缩列表和字典构成,常用作关系型数据库存储(存储对象)

    3. list是由双端链表和压缩列表构成,常用作消息队列和数据分页(栈、队列)

    4. set是由整数集合和字典构成,常用做共同好友,标签和独立IP、抽奖、随机取

    5. zset是由跳跃表、字典和压缩链表构成,常用做排行榜、权重计算

 

哈希使用 - 实现代码:

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$redis->del('hash1');

$redis->hset('hash1', 'user1', 1);

$redis->hset('hash1', 'user2', 2);

$redis->hset('hash1', 'user3', 3);

// string(1) "1"

var_dump($redis->hGet('hash1', 'user1')); 

// int(3)

var_dump($redis->hLen('hash1')); 

// array(3) { ["user1"]=> string(1) "1" ["user2"]=> string(1) "2" ["user3"]=> string(1) "3" }

var_dump($redis->hGetAll('hash1')); 

// array(3) { [0]=> string(5) "user1" [1]=> string(5) "user2" [2]=> string(5) "user3" }

var_dump($redis->hKeys('hash1')); 

// array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }

var_dump($redis->hVals('hash1')); 

// int(1)

var_dump($redis->hDel('hash1', 'user1')); 

// array(2) { ["user2"]=> string(1) "2" ["user3"]=> string(1) "3" }

var_dump($redis->hGetAll('hash1')); 

$redis->hset('hash1', 'user1', 1);

// int(2)

var_dump($redis->hIncrBy('hash1', 'user1', 1)); 

// int(1)

var_dump($redis->hIncrBy('hash1', 'user2', -1));

// float(4.1)

var_dump($redis->hIncrByFloat('hash1', 'user3', 1.1)); 

// array(3) { ["user2"]=> string(1) "1" ["user3"]=> string(18) "4.1000000000000001" ["user1"]=> string(1) "2" }

var_dump($redis->hGetAll('hash1')); 

// bool(true)

var_dump($redis->hMset('hash1', array('user4' => 4, 'user5' => 5, 'user6' => 6))); 

// array(3) { ["user4"]=> string(1) "4" ["user5"]=> string(1) "5" ["user6"]=> string(1) "6" }

var_dump($redis->hMget('hash1', array('user4', 'user5', 'user6'))); 

 

key值使用 - 实现代码:

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

// bool(true) string(5) "value"

var_dump($redis->set('name', 'value')); var_dump($redis->get('name')); 

// int(1) bool(false)

var_dump($redis->del('name')); var_dump($redis->get('name')); 

// bool(false) int(0)

var_dump($redis->exists('name')); var_dump($redis->del('name')); 

// bool(true)

$set_array = array('name1' => 'value1', 'name2' => 'value2', 'name3' => 'value3');

var_dump($redis->mset($set_array)); 

// array(2) { [0]=> string(6) "value1" [1]=> string(6) "value3" }

$get_array = array('name1', 'name3');

var_dump($redis->mget($get_array)); 

// int(2)

$del_array = array('name1', 'name3');

var_dump($redis->del($del_array)); 

// array(3) { [0]=> bool(false) [1]=> string(6) "value2" [2]=> bool(false) }

$get_array = array('name1', 'name2', 'name3');

var_dump($redis->mget($get_array)); 

$set_array = array('one' => 'value1', 'tow' => 'value2', 'three' => 'value3', 'four' => 'value4');

var_dump($redis->mset($set_array)); 

var_dump($get_array = $redis->keys('*o*')); 

var_dump($redis->mget($get_array)); 

var_dump($get_array = $redis->keys('t??')); 

var_dump($get_array = $redis->keys('t[w]*')); 

var_dump($get_array = $redis->keys('*')); 

var_dump($redis->randomkey()); 

var_dump($redis->flushDB()); 

var_dump($get_array = $redis->keys('*')); 

var_dump($redis->set('name', 'value', 10)); var_dump($redis->get('name')); 

var_dump($redis->ttl('name')); 

var_dump($redis->ttl('name1')); 

 

列表使用 - 实现代码:

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

// bool(true)

var_dump($redis->del('list1')); 

// int(3)

var_dump($redis->lPush('list1', 'v1', 'v2', 'v3'));

// array(3) { [0]=> string(2) "v3" [1]=> string(2) "v2" [2]=> string(2) "v1" }

var_dump($redis->lRange('list1', 0, -1)); 

// int(4)

var_dump($redis->rPush('list1', 'v4')); 

// string(2) "v3"

var_dump($redis->lPop('list1')); 

// string(2) "v4"

var_dump($redis->rPop('list1')); 

// bool(false)

var_dump($redis->blPop('list1')); 

// bool(false)

var_dump($redis->brPop('list1')); 

// int(2)

var_dump($redis->lLen('list1')); 

// string(2) "v1"

var_dump($redis->lIndex('list1', 1));

// bool(true)

var_dump($redis->lSet('list1', 1, 'v11')); 

// array(2) { [0]=> string(2) "v2" [1]=> string(3) "v11" }

var_dump($redis->lRange('list1', 0, -1)); 

// int(0)

var_dump($redis->lRem('list1', 'v1', 2)); 

// bool(true)

var_dump($redis->lTrim('list1', 0, 0)); 

 

有序集合 - 实现代码:

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$redis->del("zset1");

$time = time();

// int(1)

var_dump($redis->zAdd('zset1', $time, 'v0')); 

// int(1)

var_dump($redis->zAdd('zset1', $time + 1, 'v1')); 

// int(1)

var_dump($redis->zAdd('zset1', $time + 2, 'v2'));

// int(1)

var_dump($redis->zAdd('zset1', $time + 3, 'v3'));

// array(4) { [0]=> string(2) "v0" [1]=> string(2) "v1" [2]=> string(2) "v2" [3]=> string(2) "v3" }

var_dump($redis->zRange('zset1', 0, -1));

// int(2)

var_dump($redis->zRem('zset1', 'v1', 'v2'));

// array(2) { [0]=> string(2) "v0" [1]=> string(2) "v3" }

var_dump($redis->zRange('zset1', 0, $time + 10)); 

// int(3)

var_dump($redis->zAdd('zset1', $time + 4, 'v4', $time + 5, 'v5', $time + 6, 'v6'));

// array(5) { ["v6"]=> string(10) "1488277758" ["v5"]=> string(10) "1488277757" ["v4"]=> string(10) "1488277756" ["v3"]=> string(10) "1488277755" ["v0"]=> string(10) "1488277752" }

var_dump($redis->zRevRange('zset1', 0, $time + 10, true)); 

// int(5)

var_dump($redis->zCount('zset1', 0, $time + 10)); 

// int(5)

var_dump($redis->zRemRangeByScore('zset1', 0, $time + 10)); 

// int(2)

var_dump($redis->zAdd('zset1', 1, 'v1', 2, 'v2')); 

// int(2)

var_dump($redis->zCard('zset1')); 

// float(2)

var_dump($redis->zScore('zset1', 'v2'));

// float(2)

var_dump($redis->zIncrBy('zset1', 1, 'v1'));

// array(2) { ["v2"]=> string(1) "2" ["v1"]=> string(1) "2" }

var_dump($redis->zRevRange('zset1', 0, -1, true)); 

 

无序集合 - 实现代码:

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$redis->del('set1');

$redis->del('set2');

// int(3)

var_dump($redis->sAdd('set1', 'v1', 'v2', 'v3')); 

// int(3)

var_dump($redis->sCard('set1')); 

// int(2)

var_dump($redis->sAdd('set2', 'v1', 'v3')); 

// array(1) { [0]=> string(2) "v2" }

var_dump($redis->sDiff('set1', 'set2')); 

// int(1)

var_dump($redis->sDiffStore('diff', 'set1', 'set2')); 

// array(1) { [0]=> string(2) "v2" }

var_dump($redis->sMembers('diff')); 

var_dump($redis->sMembers('set1')); 

来源:原创 发布时间:2020-12-17 21:24:16