Redis简单整理

第一章 简介

Redis 是一个高性能的key-value数据库。和Memcached类似,它支持存储的value类型相对更多。

历史:Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。VMware 公司从2010年开始赞助Redis的开发。作者 Salvatore Sanfilippo(塞尔瓦托) 和 pieter noordhuis (彼得)也分别从3月、5月加入VMware 全职开发 Redis。

Redis有三个主要特点,使它优越于其它键值数据存储系统

  • Redis将其数据库完全保存在内存中,使用磁盘进行持久化。
  • 与其它键值数据存储相比,Redis有一组相对丰富的数据类型。
  • Redis可以将数据复制到任意数量的从机中。

Redis官方网网站是:http://www.redis.io

Redis的特性

  • 存储结构 - Redis支持开发人员常用的大多数数据类型,例如列表,集合,排序集和散列等等。这使得Redis很容易被用来解决各种问题。

  • 内存与持久化

    1. Redis数据库中所有数据都存储在内存中,固然Redis读写速度非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执行81000次的读取/获取(GET)操作。
    2. 对于内存中数据易丢失问题,Redis 提供了对持久化的支持,即将内存中数据异步写入到硬盘中,同时不影响继续提供服务。
  • 功能丰富 - Redis是一个多实用工具,可用于多种用例,如:缓存,消息队列(Redis本地支持发布/订阅),应用程序中的任何短期数据,例如,web应用程序中的会话,网页命中计数等。

  • 简单稳定 - Redis 中使用命令来读写数据,就相当于SQL语句。Redis 提供了几十种不同的编程语言客户端库,这些库很好地封装了Redis命令,使得在程序中Redis进行交互变得更容易。

举个例子:获取 posts 表内 id 为 1 的记录的title字段。

## SQL
SELECT title FROM posts WHERE id = 1 LIMIT 1

## Redis
HEGET post:1 title

注解:HGET 就是一个命令,Redis 提供了100多个命令,但是常用的却只有十几个。

Redis 命令文档:http://www.redis.cn/commands.html

第二章 准备与安装

安装环境准备

## 查看系统版本
cat /etc/redhat-release

## 安装编译工具
gcc tcl

Redis 安装

wget http://download.redis.io/releases/redis-3.2.8.tar.gz

cd redis-3.2.8

## 编译
make

## 安装-可执行程序会被复制到/usr/local/bin 目录
make install
文件名说明
redis-serverRedis 服务器
redis-cliRedis 命令行客户端
redis-benchmarkRedis 性能测试工具
redis-check-aofAOF 文件修复工具
redis-check-rdbRDB 文件检测工具

查看 redis 安装位置

which redis-server
which redis-cli

启动和停止

启动 Redis 服务

redis-server --help
## 直接启动
redis-server 

## 自定义端口号
redis-server --port 6380

启动 Redis 客户端

redis-cli --help
redis-cli -h 127.0.0.1 -p 6379

## 查询服务信息
127.0.0.1:6379> info
# Server
redis_version:3.2.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d0f77cfbe45511d0


第三章 入门

Redis数据类型

字符串-string

127.0.0.1:6379> set str bing
OK
127.0.0.1:6379> get str
"bing"
127.0.0.1:6379> del str
(integer) 1
127.0.0.1:6379> get str
(nil)

## 递增与递减操作

127.0.0.1:6379> set num 7
OK
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> incr num
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9

官方命令:https://redis.io/commands#string

列表-list

Redis列表只是字符串列表,按插入顺序排序。可以在列表的头部或尾部添加Redis列表中的元素。队列:先进先出

redis 127.0.0.1:6379> lpush alist redis 
(integer) 1 
redis 127.0.0.1:6379> lpush alist mongodb 
(integer) 2 
redis 127.0.0.1:6379> lpush alist sqlite 
(integer) 3 

集合-set型

Redis集合是唯一字符串的无序集合。 唯一值表示集合中不允许键中有重复的数据。

127.0.0.1:6379> sadd teacher bing
(integer) 1
127.0.0.1:6379> sadd teacher lau
(integer) 1
127.0.0.1:6379> sadd teacher bing
(integer) 0

127.0.0.1:6379> scard teacher
(integer) 3

127.0.0.1:6379> smembers teacher
1) "bin"
2) "bing"

127.0.0.1:6379> sismember teacher bing
(integer) 1
127.0.0.1:6379> srem teacher bing
(integer) 1
127.0.0.1:6379> sismember teacher bing
(integer) 0

注意 - 在上面的示例中,bing被添加了两次,但是由于集合的唯一属性,所以它只算添加一次。

  • sadd - 添加一个或多个指定的元素到某集合中。
  • scard - 返回某集合元素的数量。
  • smembers - 查看某个集合所有数据
  • sismember - 判断某个值是否存在与某集合(存在:1;不存在:0)。
  • srem - 在某集合中移除指定的元素
  • SINTER key1 [key2] - 相交多个集合
  • SDIFF key1 [key2] - 减去多个集合

哈希/散列-hash

理解:哈希/散列型,是将多个键值对存储到一个键里面。

image

127.0.0.1:6379> hset info name braem
(integer) 1
127.0.0.1:6379> hset info user braem
(integer) 1
127.0.0.1:6379> hset info age 18
(integer) 1

127.0.0.1:6379> hget info user
"braem"

127.0.0.1:6379> hmget info name user age
1) "braem"
2) "braem"
3) "18"

127.0.0.1:6379> hlen info
(integer) 3

127.0.0.1:6379> hset info name bing
(integer) 0
127.0.0.1:6379> hmget info name user age
1) "bing"
2) "braem"
3) "18"

  • hset 设置 key 指定的哈希集中指定字段的值。
    1. 如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
    2. 如果字段在哈希集中存在,它将被重写。
  • hget - 返回 key 指定的哈希集中该字段所关联的值
  • hlen - 返回 key 指定的哈希集包含的字段的数量。
  • hmget - 返回 key 指定的哈希集中指定字段的值。
  • 其他命令 http://www.redis.cn/commands/hset.html

可排序集合-sorted set

Redis可排序集合类似于Redis集合,是不重复的字符集合。

不同之处在于,排序集合的每个成员都与分数相关联,这个分数用于按最小分数到最大分数来排序的排序集合。

image

127.0.0.1:6379> zadd score 100 xming
(integer) 1
127.0.0.1:6379> zadd score 90 xhong
(integer) 1
127.0.0.1:6379> zadd score 59.9 xhei
(integer) 1

127.0.0.1:6379> zcard score
(integer) 3

127.0.0.1:6379> zrange score 0 5 withscores
1) "xhei"
2) "59.899999999999999"
3) "xhong"
4) "90"
5) "xming"
6) "100"

127.0.0.1:6379> zrevrange score 0 5 withscores
...
127.0.0.1:6379> zrevrank score xming
...
...

注意:某个有序集中成员是唯一的,但分数值可以重复。

  • zadd - 将所有指定成员添加到键为key有序集合(sorted set)里面。
  • zcard - 返回某个有序集元素个数。
  • zrank - 获得成员按score值递增(从小到大)排列的排名
  • zrange - 返回有序集key中,指定区间内的成员。其中成员的位置按score值递减(从小到大)来排列
  • zrevrange - 与 zrange 排序相反。
  • zrevrank - 获得成员按score值递增(从大到小)排列的排名
  • 其他 http://www.redis.cn/commands/zadd.html

PHP 操作 Redis

Window 下安装Redis扩展

下载地址:https://pecl.php.net/package/redis/3.1.2/windows

一步、两步;一步、两步。

Linux 下编译Redis扩展

cd /usr/local/src/
wget https://pecl.php.net/get/redis-3.1.2.tgz
 
tar zxvf redis-3.1.2.tgz 
cd redis-3.1.2

/usr/local/php/bin/phpize 
./configure --with-php-config=/usr/local/php/bin/php-config 
make && make install

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/

将编译出的扩展文件 redis.so,添加至 php.ini

vim /usr/local/php7/lib/php.ini 

重启php-fpm,再打印phpinfo中搜索 Redis,看到如下那么恭喜您已经完成PHP与Redis整合:

image

连接到 redis 服务

文档地址:https://github.com/phpredis/phpredis#class-redis

//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";

//查看服务是否运行
echo "Server is running: " . $redis->ping();

string-字符串

## set
$redis->set("str", "this is string");

## get
$redis->get("str");

## exists
$redis->exists('key'); /*  TRUE OR FALSE*/

## incr, incrBy
$redis->incr('key1'); /* key1 didn't exists, set to 0 before the increment */
					  /* and now has the value 1  */
$redis->incr('key1'); /* 2 */
$redis->incrBy('key1', 10); /* 12 */

## incrByFloat
$redis->incrByFloat('key1', 1.5); /* key1 didn't exist, so it will now be 1.5 */
$redis->incrByFloat('key1', 1.5); /* 3 */
$redis->incrByFloat('key1', -1.5); /* 1.5 */

## decr, decrBy
$redis->decr('key1'); /* key1 didn't exists, set to 0 before the increment */
					  /* and now has the value -1  */
$redis->decr('key1'); /* -2 */
$redis->decrBy('key1', 10); /* -12 */

## delete
$redis->delete('key1', 'key2'); /* return 2 */
$redis->delete(array('key3', 'key4')); /* return 2 */

实用手册:https://github.com/phpredis/phpredis#keys

中文手册:http://www.runoob.com/redis/redis-strings.html

list-队列

  • lLen, lSize - Get the length/size of a list
  • lPop - Remove and get the first element in a list
  • lPush - Prepend one or multiple values to a list
  • lSet - Set the value of an element in a list by its index
  • ......

https://github.com/phpredis/phpredis#lists

$redis->lPush('alist','A');
$redis->lPush('alist','B');
$redis->lPush('alist','C');
echo $redis->rPop('alist');  /* return A */
$redis->rPush('blist','A');
$redis->rPush('blist','B');
$redis->rPush('blist','C');
echo $redis->lPop('blist'); /* return A */

set-集合

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

  • sAdd - Add one or more members to a set
  • sCard, sSize - Get the number of members in a set
  • sIsMember, sContains - Determine if a given value is a member of a set
  • sMembers, sGetMembers - Get all the members in a set

更多参考: https://github.com/phpredis/phpredis#sets

## sAdd
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3'); /* 'key1' => {'member1', 'member2', 'member3'}*/
## sCard
$redis->sCard('key1'); /* 3 */
$redis->sCard('keyX'); /* 0 */
## sIsMember
$redis->sIsMember('key1', 'member1'); /* TRUE */
$redis->sIsMember('key1', 'memberX'); /* FALSE */
## sMembers
var_dump($redis->sMembers('key1'));
array (size=3)
  0 => string 'member2' (length=7)
  1 => string 'member1' (length=7)
  2 => string 'member3' (length=7)

hash-哈希

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  • hGet - Get the value of a hash field
  • hGetAll - Get all the fields and values in a hash
  • hKeys - Get all the fields in a hash
  • hLen - Get the number of fields in a hash
  • hMGet - Get the values of all the given hash fields
  • hMSet - Set multiple hash fields to multiple values
  • hSet - Set the string value of a hash field
  • ......

更多参考:https://github.com/phpredis/phpredis#hashes

$redis->delete('info');
$redis->hSet('info','name','bing');
$redis->hSet('info','age',18);
$redis->hSet('info','sex','');

$redis->hGet('info','name');   /* bing */

var_dump($redis->hMGet('info',['name','age']));
array (size=2)
  'name' => string 'bing' (length=4)
  'age' => string '18' (length=2)
  
var_dump($redis->hGetAll('info'));
array (size=3)
  'name' => string 'bing' (length=4)
  'age' => string '18' (length=2)
  'sex' => string '' (length=3)

sorted-sets-有序集合

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

  • zAdd - Add one or more members to a sorted set or update its score if it already exists
  • zCard, zSize - Get the number of members in a sorted set
  • zRange - Return a range of members in a sorted set, by index
  • zRank, zRevRank - Determine the index of a member in a sorted set
  • zRevRange - Return a range of members in a sorted set, by index, with scores ordered from high to low

更多参考:https://github.com/phpredis/phpredis#sorted-sets

$redis->zAdd('score',100,'老刘');
$redis->zAdd('score',90,'小明');
$redis->zAdd('score',59.9,'BING');

var_dump($redis->zSize('score'));
var_dump($redis->zCard('score'));

var_dump($redis->zCount('score',90,100));

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

echo $redis->zRank('score','BING');
echo '<hr>';
echo $redis->zRevRank('score','BING');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值