<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Redis &#8211; 个人随笔</title>
	<atom:link href="/classify/%E6%95%B0%E6%8D%AE%E5%BA%93/redis/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Sat, 19 May 2018 14:29:11 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>/wp-content/uploads/2022/01/cropped-截屏2022-01-01-18.57.09-32x32.png</url>
	<title>Redis &#8211; 个人随笔</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Redis 安装部署、数据类型、应用场景、TP中使用Redis</title>
		<link>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html</link>
					<comments>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html#respond</comments>
		
		<dc:creator><![CDATA[Mr.Lee]]></dc:creator>
		<pubDate>Sat, 19 May 2018 14:29:11 +0000</pubDate>
				<category><![CDATA[Redis]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[TP中使用Redis]]></category>
		<category><![CDATA[安装部署]]></category>
		<category><![CDATA[应用场景]]></category>
		<category><![CDATA[数据类型]]></category>
		<guid isPermaLink="false">/?p=5175</guid>

					<description><![CDATA[NoSQL（Redis） 一、了解Redis 1、什么是Redis Redis是一个用C语言编写的开源软件 R [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1>NoSQL（Redis）</h1>
<h1>一、了解Redis</h1>
<h2>1、什么是Redis</h2>
<ul>
<li>
    Redis是一个用C语言编写的开源软件
  </li>
<li>
    Redis是基于内存的存储的键值对（Key-Value）数据库（注：默认支持数据持久化）
  </li>
<li>
    Redis支持丰富的数据类型，如： String（字符串）、hash（哈希）list （列表）、
  </li>
</ul>
<p>
  set（集合）、sorted set（有序集合）。
</p>
<p>
  键值对形式存储
</p>
<p>
  js  -&gt;  {键:值}
</p>
<p>
  数组 -&gt; [键=&gt;指]
</p>
<p>
  数据持久化：数据不会丢失
</p>
<h2>2、Redis的优势</h2>
<ul>
<li>
    性能极高 – Redis能读的速度是11万次/s，写的速度是8.1万次/s 。
  </li>
<li>
    支持丰富的数据结构：String（字符串）、hash（哈希）、list （列表）、set（集合）、
  </li>
</ul>
<p>
  sorted set（有序集合）等。
</p>
<ul>
<li>
    支持数据持久化（服务器重启后数据不会丢失，自动从文件中加载到内存中）
  </li>
</ul>
<h2>Redis与Memcache的区别</h2>
<p>
  都是基于内存存储的
</p>
<p>
  redis支持的数据类型更多、memcache只支持字符串
</p>
<p>
  redis支持数据持久化
</p>
<h1>二、Redis的安装和部署</h1>
<h2>步骤一，下载安装包</h2>
<p>
  去官网下（http://redis.io/download）载并上传到服务器
</p>
<p><img fetchpriority="high" decoding="async" width="888" height="408" src="/wp-content/uploads/2018/05/word-image-4679.png" class="wp-image-5176" srcset="/wp-content/uploads/2018/05/word-image-4679.png 888w, /wp-content/uploads/2018/05/word-image-4679-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4679-768x353.png 768w" sizes="(max-width: 888px) 100vw, 888px" /></p>
<h2>步骤二，编译源程序</h2>
<ul>
<li>
    tar -zxvf redis-2.6.14.tar.gz #解压
  </li>
<li>
    cd redis-2.6.14 			  #进入解压目录
  </li>
<li>
    make      		  		  #编译（将源代码文件编译成可执行文件）
  </li>
</ul>
<p><img decoding="async" width="653" height="290" src="/wp-content/uploads/2018/05/word-image-4680.png" class="wp-image-5177" srcset="/wp-content/uploads/2018/05/word-image-4680.png 653w, /wp-content/uploads/2018/05/word-image-4680-300x133.png 300w" sizes="(max-width: 653px) 100vw, 653px" /></p>
<h2>步骤三，将redis源码目录下的  src目录里的 redis-cli和 redis-server 拷贝到工作目录里.同时将源码根目录下的redis.conf 也拷贝到工作目录里</h2>
<ul>
<li>
    mkdir -p /php/server/redis   #创建redis文件夹
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/src/redis-cli /php/server/redis   #拷贝redis客户端文件
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/src/redis-server /php/server/redis #拷贝redis服务端文件
  </li>
<li>
    \cp -rf /php/tools/redis-2.6.14/redis.conf /php/server/redis     #拷贝redis配置文件
  </li>
</ul>
<p><img decoding="async" width="408" height="138" src="/wp-content/uploads/2018/05/word-image-4681.png" class="wp-image-5178" srcset="/wp-content/uploads/2018/05/word-image-4681.png 408w, /wp-content/uploads/2018/05/word-image-4681-300x101.png 300w" sizes="(max-width: 408px) 100vw, 408px" /></p>
<h2>步骤四，启动redis服务器</h2>
<ul>
<li>
    语法：./redis-server ./redis.conf
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="973" height="552" src="/wp-content/uploads/2018/05/word-image-4682.png" class="wp-image-5179" srcset="/wp-content/uploads/2018/05/word-image-4682.png 973w, /wp-content/uploads/2018/05/word-image-4682-300x170.png 300w, /wp-content/uploads/2018/05/word-image-4682-768x436.png 768w" sizes="(max-width: 973px) 100vw, 973px" /></p>
<p>
  脚下留心：默认是前台启动，启动后将无法继续执行其他指令
</p>
<p>
  解决：
</p>
<p><img loading="lazy" decoding="async" width="610" height="411" src="/wp-content/uploads/2018/05/word-image-4683.png" class="wp-image-5180" srcset="/wp-content/uploads/2018/05/word-image-4683.png 610w, /wp-content/uploads/2018/05/word-image-4683-300x202.png 300w" sizes="(max-width: 610px) 100vw, 610px" /><br />
<img loading="lazy" decoding="async" width="601" height="122" src="/wp-content/uploads/2018/05/word-image-4684.png" class="wp-image-5181" srcset="/wp-content/uploads/2018/05/word-image-4684.png 601w, /wp-content/uploads/2018/05/word-image-4684-300x61.png 300w" sizes="(max-width: 601px) 100vw, 601px" /></p>
<h2>步骤四，登陆验证</h2>
<ul>
<li>
    语法：./redis-cli
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="398" height="118" src="/wp-content/uploads/2018/05/word-image-4685.png" class="wp-image-5182" srcset="/wp-content/uploads/2018/05/word-image-4685.png 398w, /wp-content/uploads/2018/05/word-image-4685-300x89.png 300w" sizes="(max-width: 398px) 100vw, 398px" /></p>
<h1>三、操作Redis</h1>
<ul>
<li>
    使用redis客户端redis-cli操作（CRUD）
  </li>
<li>
    使用PHP程序来操作（CURD）
  </li>
</ul>
<h1>四、使用redis客户端redis-cli操作（CRUD）</h1>
<h2>1、连接redis服务通过redis客户端redis-cli</h2>
<ul>
<li>
    语法：./redis 参数
  </li>
<li>
    参数：
  </li>
<li>
    -h  服务器地址（host）
  </li>
<li>
    -p  端口（6379）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="636" height="188" src="/wp-content/uploads/2018/05/word-image-4686.png" class="wp-image-5183" srcset="/wp-content/uploads/2018/05/word-image-4686.png 636w, /wp-content/uploads/2018/05/word-image-4686-300x89.png 300w" sizes="(max-width: 636px) 100vw, 636px" /></p>
<h2>2、Redis操作基础命令</h2>
<h3>1）添加、修改（CU）</h3>
<ul>
<li>
    语法：set 键 值
  </li>
<li>
    说明：存在-修改，不存在-则创建
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="624" height="261" src="/wp-content/uploads/2018/05/word-image-4687.png" class="wp-image-5184" srcset="/wp-content/uploads/2018/05/word-image-4687.png 624w, /wp-content/uploads/2018/05/word-image-4687-300x125.png 300w" sizes="(max-width: 624px) 100vw, 624px" /></p>
<h3>2）获取指定key的值（R）</h3>
<ul>
<li>
    语法：get 键
  </li>
<li>
    说明：不存在则返回nil（表示无值）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="404" height="160" src="/wp-content/uploads/2018/05/word-image-4688.png" class="wp-image-5185" srcset="/wp-content/uploads/2018/05/word-image-4688.png 404w, /wp-content/uploads/2018/05/word-image-4688-300x119.png 300w" sizes="(max-width: 404px) 100vw, 404px" /></p>
<h3>3）删除指定key的值（D）</h3>
<ul>
<li>
    语法： del 键1&#8230;.键n
  </li>
<li>
    说明： 返回删除成功的个数（多个之间用空格隔开）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="405" height="244" src="/wp-content/uploads/2018/05/word-image-4689.png" class="wp-image-5186" srcset="/wp-content/uploads/2018/05/word-image-4689.png 405w, /wp-content/uploads/2018/05/word-image-4689-300x181.png 300w" sizes="(max-width: 405px) 100vw, 405px" /></p>
<h1>redis常用的数据类型</h1>
<h2>■ 介绍</h2>
<p><img loading="lazy" decoding="async" width="524" height="214" src="/wp-content/uploads/2018/05/word-image-4690.png" class="wp-image-5187" srcset="/wp-content/uploads/2018/05/word-image-4690.png 524w, /wp-content/uploads/2018/05/word-image-4690-300x123.png 300w" sizes="(max-width: 524px) 100vw, 524px" /></p>
<p><a href="http://www.redis.net.cn/tutorial/3502.html">http://www.redis.net.cn/tutorial/3502.html</a>
</p>
<h2>1、字符串（String）类型及操作</h2>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="466" height="86" src="/wp-content/uploads/2018/05/word-image-4691.png" class="wp-image-5188" srcset="/wp-content/uploads/2018/05/word-image-4691.png 466w, /wp-content/uploads/2018/05/word-image-4691-300x55.png 300w" sizes="(max-width: 466px) 100vw, 466px" /></p>
<h3>2）设置N个键（mset）</h3>
<p>
  语法：mset  键1  值1  &#8230;   键n  值n
</p>
<p>
  说明：m开头一般代表操作多个键
</p>
<p><img loading="lazy" decoding="async" width="609" height="390" src="/wp-content/uploads/2018/05/word-image-4692.png" class="wp-image-5189" srcset="/wp-content/uploads/2018/05/word-image-4692.png 609w, /wp-content/uploads/2018/05/word-image-4692-300x192.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<h3>3）获取N个键（mget）</h3>
<p>
  语法：mget 键1 &#8230;. 键n
</p>
<p>
  说明：一次性返回多个值（不存在则返回nil）
</p>
<p><img loading="lazy" decoding="async" width="486" height="113" src="/wp-content/uploads/2018/05/word-image-4693.png" class="wp-image-5190" srcset="/wp-content/uploads/2018/05/word-image-4693.png 486w, /wp-content/uploads/2018/05/word-image-4693-300x70.png 300w" sizes="(max-width: 486px) 100vw, 486px" /></p>
<h3>4）递增递减（incr和decr）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    incr 键
  </li>
<li>
    decr 键
  </li>
<li>
    说明：默认增加1（必须是整型）、返回增加后的数字
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="573" height="309" src="/wp-content/uploads/2018/05/word-image-4694.png" class="wp-image-5191" srcset="/wp-content/uploads/2018/05/word-image-4694.png 573w, /wp-content/uploads/2018/05/word-image-4694-300x162.png 300w" sizes="(max-width: 573px) 100vw, 573px" /></p>
<h3>5）增减指定值（incrby和decrby）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    incrby 键 数字
  </li>
<li>
    decrby 键 数字
  </li>
<li>
    说明：给键设置指定值
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="417" height="235" src="/wp-content/uploads/2018/05/word-image-4695.png" class="wp-image-5192" srcset="/wp-content/uploads/2018/05/word-image-4695.png 417w, /wp-content/uploads/2018/05/word-image-4695-300x169.png 300w" sizes="(max-width: 417px) 100vw, 417px" /></p>
<h3>6）拼接-字符串追加（append）</h3>
<ul>
<li>
    语法：append  键  追加的内容
  </li>
<li>
    说明：返回追加之后的字符长度
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="482" height="265" src="/wp-content/uploads/2018/05/word-image-4696.png" class="wp-image-5193" srcset="/wp-content/uploads/2018/05/word-image-4696.png 482w, /wp-content/uploads/2018/05/word-image-4696-300x165.png 300w" sizes="(max-width: 482px) 100vw, 482px" /></p>
<h3>7）字符串截取（substr）</h3>
<ul>
<li>
    语法：substr 键 起始位置 结束位置
  </li>
<li>
    说明：下标从0开始（含前含后）
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="472" height="156" src="/wp-content/uploads/2018/05/word-image-4697.png" class="wp-image-5194" srcset="/wp-content/uploads/2018/05/word-image-4697.png 472w, /wp-content/uploads/2018/05/word-image-4697-300x99.png 300w" sizes="(max-width: 472px) 100vw, 472px" /></p>
<h3>︴场景案例</h3>
<p>
  网站计数统计
</p>
<p>
  文章详情页统计
</p>
<p><a href="http://web.umeng.com/main.php?c=user&amp;a=index">http://web.umeng.com/main.php?c=user&amp;a=index</a>
</p>
<p>
  incr 键
</p>
<h2>2、哈希（Hash）类型</h2>
<h3>︴思考：为什么学习该类型</h3>
<p>
  用来存储复杂的数据结果，如存储人信息（有姓名、年龄、电话等）存储商品（有价格、颜色等属性）。
</p>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="517" height="157" src="/wp-content/uploads/2018/05/word-image-4698.png" class="wp-image-5195" srcset="/wp-content/uploads/2018/05/word-image-4698.png 517w, /wp-content/uploads/2018/05/word-image-4698-300x91.png 300w" sizes="(max-width: 517px) 100vw, 517px" /><br />
<img loading="lazy" decoding="async" width="594" height="178" src="/wp-content/uploads/2018/05/word-image-4699.png" class="wp-image-5196" srcset="/wp-content/uploads/2018/05/word-image-4699.png 594w, /wp-content/uploads/2018/05/word-image-4699-300x90.png 300w" sizes="(max-width: 594px) 100vw, 594px" /><br />
<img loading="lazy" decoding="async" width="403" height="182" src="/wp-content/uploads/2018/05/word-image-4700.png" class="wp-image-5197" srcset="/wp-content/uploads/2018/05/word-image-4700.png 403w, /wp-content/uploads/2018/05/word-image-4700-300x135.png 300w" sizes="(max-width: 403px) 100vw, 403px" /></p>
<h3>2）设置/获取hash字段（hset）</h3>
<p>
  语法：hset 键 字段 值
</p>
<p><img loading="lazy" decoding="async" width="660" height="170" src="/wp-content/uploads/2018/05/word-image-4701.png" class="wp-image-5199" srcset="/wp-content/uploads/2018/05/word-image-4701.png 660w, /wp-content/uploads/2018/05/word-image-4701-300x77.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h3>3）键获取一个字段值（hget）</h3>
<p>
  语法：hget 键 字段
</p>
<p><img loading="lazy" decoding="async" width="660" height="207" src="/wp-content/uploads/2018/05/word-image-4702.png" class="wp-image-5200" srcset="/wp-content/uploads/2018/05/word-image-4702.png 660w, /wp-content/uploads/2018/05/word-image-4702-300x94.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></p>
<h3>4）键添加N个字段（hmset）</h3>
<p>
  语法：hmset 键 字段1 值1 &#8230; 字段n 值n
</p>
<p><img loading="lazy" decoding="async" width="705" height="100" src="/wp-content/uploads/2018/05/word-image-4703.png" class="wp-image-5201" srcset="/wp-content/uploads/2018/05/word-image-4703.png 705w, /wp-content/uploads/2018/05/word-image-4703-300x43.png 300w" sizes="(max-width: 705px) 100vw, 705px" /></p>
<h3>5）键获取N个字段（hmget）</h3>
<p>
  语法：hmget 键 字段1 字段n
</p>
<p><img loading="lazy" decoding="async" width="707" height="204" src="/wp-content/uploads/2018/05/word-image-4704.png" class="wp-image-5202" srcset="/wp-content/uploads/2018/05/word-image-4704.png 707w, /wp-content/uploads/2018/05/word-image-4704-300x87.png 300w" sizes="(max-width: 707px) 100vw, 707px" /></p>
<h3>6）字段增值（hincrby）</h3>
<p>
  语法：hincrby 键 字段 数字
</p>
<p><img loading="lazy" decoding="async" width="700" height="181" src="/wp-content/uploads/2018/05/word-image-4705.png" class="wp-image-5203" srcset="/wp-content/uploads/2018/05/word-image-4705.png 700w, /wp-content/uploads/2018/05/word-image-4705-300x78.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></p>
<h3>7）检测键字段（hexists）</h3>
<p>
  语法：hexists 键 字段
</p>
<p>
  说明：1-存在，0-不存在
</p>
<p><img loading="lazy" decoding="async" width="667" height="164" src="/wp-content/uploads/2018/05/word-image-4706.png" class="wp-image-5204" srcset="/wp-content/uploads/2018/05/word-image-4706.png 667w, /wp-content/uploads/2018/05/word-image-4706-300x74.png 300w" sizes="(max-width: 667px) 100vw, 667px" /></p>
<h3>8）删除键字段（hdel）</h3>
<p>
  语法：hdel 键 字段
</p>
<p><img loading="lazy" decoding="async" width="588" height="164" src="/wp-content/uploads/2018/05/word-image-4707.png" class="wp-image-5205" srcset="/wp-content/uploads/2018/05/word-image-4707.png 588w, /wp-content/uploads/2018/05/word-image-4707-300x84.png 300w" sizes="(max-width: 588px) 100vw, 588px" /></p>
<h3>9）键个数（hlen）</h3>
<p>
  语法：hlen 键
</p>
<p><img loading="lazy" decoding="async" width="434" height="128" src="/wp-content/uploads/2018/05/word-image-4708.png" class="wp-image-5206" srcset="/wp-content/uploads/2018/05/word-image-4708.png 434w, /wp-content/uploads/2018/05/word-image-4708-300x88.png 300w" sizes="(max-width: 434px) 100vw, 434px" /></p>
<h3>10）哈希查询（hkeys 和 hvals 和 hgetall）</h3>
<ul>
<li>
    语法：
  </li>
<li>
    查询所有键   	hkeys*
  </li>
<li>
    查询所有值   	hvals
  </li>
<li>
    查询所有键和值 hgetall
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="504" height="343" src="/wp-content/uploads/2018/05/word-image-4709.png" class="wp-image-5207" srcset="/wp-content/uploads/2018/05/word-image-4709.png 504w, /wp-content/uploads/2018/05/word-image-4709-300x204.png 300w, /wp-content/uploads/2018/05/word-image-4709-220x150.png 220w" sizes="(max-width: 504px) 100vw, 504px" /></p>
<h2>列表（List）类型（注：后期可以当消息队列来使用 ★★★★★）</h2>
<h3>1）概念</h3>
<p><img loading="lazy" decoding="async" width="521" height="202" src="/wp-content/uploads/2018/05/word-image-4710.png" class="wp-image-5208" srcset="/wp-content/uploads/2018/05/word-image-4710.png 521w, /wp-content/uploads/2018/05/word-image-4710-300x116.png 300w" sizes="(max-width: 521px) 100vw, 521px" /><br />
<img loading="lazy" decoding="async" width="743" height="332" src="/wp-content/uploads/2018/05/word-image-4711.png" class="wp-image-5209" srcset="/wp-content/uploads/2018/05/word-image-4711.png 743w, /wp-content/uploads/2018/05/word-image-4711-300x134.png 300w" sizes="(max-width: 743px) 100vw, 743px" /></p>
<p>
  先进后出：lpush   lpop
</p>
<p>
  先进先出：lpush   rpop
</p>
<p><img loading="lazy" decoding="async" width="218" height="159" src="/wp-content/uploads/2018/05/word-image-4712.png" class="wp-image-5210" /></p>
<h3>2）左进（lpush）</h3>
<p>
  语法：lpush 键 值
</p>
<p>
  说明：返回数据长度（从左边压入）
</p>
<p><img loading="lazy" decoding="async" width="474" height="145" src="/wp-content/uploads/2018/05/word-image-4713.png" class="wp-image-5211" srcset="/wp-content/uploads/2018/05/word-image-4713.png 474w, /wp-content/uploads/2018/05/word-image-4713-300x92.png 300w" sizes="(max-width: 474px) 100vw, 474px" /></p>
<h3>3）查询（lrange）</h3>
<p>
  语法：lrange 键 起始位置 结束位置
</p>
<p>
  说明：下标从0开始含前含后（注：-1表示倒数第一个，-2倒数第二个）
</p>
<p><img loading="lazy" decoding="async" width="573" height="179" src="/wp-content/uploads/2018/05/word-image-4714.png" class="wp-image-5212" srcset="/wp-content/uploads/2018/05/word-image-4714.png 573w, /wp-content/uploads/2018/05/word-image-4714-300x94.png 300w" sizes="(max-width: 573px) 100vw, 573px" /></p>
<h3>4）右进（rpush）</h3>
<p>
  语法：rpush 键 值
</p>
<p>
  说明：返回数据长度（从右边压入）
</p>
<p><img loading="lazy" decoding="async" width="656" height="341" src="/wp-content/uploads/2018/05/word-image-4715.png" class="wp-image-5213" srcset="/wp-content/uploads/2018/05/word-image-4715.png 656w, /wp-content/uploads/2018/05/word-image-4715-300x156.png 300w" sizes="(max-width: 656px) 100vw, 656px" /></p>
<h3>5）头出（lpop）</h3>
<p>
  语法：lpop 键
</p>
<p>
  说明：从左边弹出，返回弹出的数据
</p>
<h3>6）尾出（rpop）</h3>
<p>
  语法：rpop 键
</p>
<p>
  说明：从右边弹出，返回弹出的数据
</p>
<p><img loading="lazy" decoding="async" width="627" height="324" src="/wp-content/uploads/2018/05/word-image-4716.png" class="wp-image-5214" srcset="/wp-content/uploads/2018/05/word-image-4716.png 627w, /wp-content/uploads/2018/05/word-image-4716-300x155.png 300w" sizes="(max-width: 627px) 100vw, 627px" /></p>
<h2>4、集合（Set）类型</h2>
<h3>︴案例：可能认识好友</h3>
<p>
  用户表
</p>
<p>
  张三  1
</p>
<p>
  李四  2
</p>
<p>
  王五  3
</p>
<p>
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-
</p>
<p>
  好友关系表
</p>
<p>
  自增主键    用户ID    粉丝
</p>
<p>
  1   	      1           2
</p>
<p>
  2           1           3
</p>
<p>
  3           2           1
</p>
<p>
  4           2           3
</p>
<p>
  查出关注张三的用户（张三的粉丝）    2  3
</p>
<p>
  查出关注李四的用户（李四的粉丝）    1  3
</p>
<p>
  通过PHP赛选公共用户
</p>
<p>
  步骤1：查询张三的粉丝
</p>
<p>
  select * from 好友表 where id = 1
</p>
<p>
  步骤2：查询李四的粉丝
</p>
<p>
  select * from 好友表 where id = 2
</p>
<p>
  步骤3：通过php赛选获取公共好友
</p>
<p><img loading="lazy" decoding="async" width="620" height="331" src="/wp-content/uploads/2018/05/word-image-4717.png" class="wp-image-5215" srcset="/wp-content/uploads/2018/05/word-image-4717.png 620w, /wp-content/uploads/2018/05/word-image-4717-300x160.png 300w" sizes="(max-width: 620px) 100vw, 620px" /></p>
<h3>︴语法图</h3>
<p><img loading="lazy" decoding="async" width="754" height="288" src="/wp-content/uploads/2018/05/word-image-4718.png" class="wp-image-5216" srcset="/wp-content/uploads/2018/05/word-image-4718.png 754w, /wp-content/uploads/2018/05/word-image-4718-300x115.png 300w" sizes="(max-width: 754px) 100vw, 754px" /></p>
<h3>1）添加（sadd）</h3>
<p>
  语法： sadd 集合名 数据
</p>
<p>
  说明： 给指定集合添加数据
</p>
<p><img loading="lazy" decoding="async" width="468" height="279" src="/wp-content/uploads/2018/05/word-image-4719.png" class="wp-image-5217" srcset="/wp-content/uploads/2018/05/word-image-4719.png 468w, /wp-content/uploads/2018/05/word-image-4719-300x179.png 300w" sizes="(max-width: 468px) 100vw, 468px" /></p>
<h3>2）查看 （smembers key）</h3>
<ul>
<li>
    语法：smembers key
  </li>
<li>
    作用：查看指定集合中的数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="468" height="279" src="/wp-content/uploads/2018/05/word-image-4720.png" class="wp-image-5218" srcset="/wp-content/uploads/2018/05/word-image-4720.png 468w, /wp-content/uploads/2018/05/word-image-4720-300x179.png 300w" sizes="(max-width: 468px) 100vw, 468px" /></p>
<h3>3）差集（sdiff）</h3>
<ul>
<li>
    语法：sdiff 集合名1 &#8230; 集合名n
  </li>
<li>
    作用：获取输入第一个集合不属于其他集合的数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="836" height="86" src="/wp-content/uploads/2018/05/word-image-4721.png" class="wp-image-5219" srcset="/wp-content/uploads/2018/05/word-image-4721.png 836w, /wp-content/uploads/2018/05/word-image-4721-300x31.png 300w, /wp-content/uploads/2018/05/word-image-4721-768x79.png 768w" sizes="(max-width: 836px) 100vw, 836px" /></p>
<p>
  ︴案例1
</p>
<p>
  set_1   1  2  3
</p>
<p>
  set_2   2  4  5
</p>
<p>
  指令：sdiff  set_1   set_2
</p>
<p>
  答案：1 3
</p>
<p><img loading="lazy" decoding="async" width="572" height="380" src="/wp-content/uploads/2018/05/word-image-4722.png" class="wp-image-5220" srcset="/wp-content/uploads/2018/05/word-image-4722.png 572w, /wp-content/uploads/2018/05/word-image-4722-300x199.png 300w" sizes="(max-width: 572px) 100vw, 572px" /></p>
<p>
  ︴案例2
</p>
<p>
  set_1   1  2  3
</p>
<p>
  set_2   1  4  5
</p>
<p>
  set_3   2  6  8
</p>
<p>
  指令：sdiff   set_1  set_2  set_3
</p>
<p>
  结果：3
</p>
<p><img loading="lazy" decoding="async" width="648" height="384" src="/wp-content/uploads/2018/05/word-image-4723.png" class="wp-image-5221" srcset="/wp-content/uploads/2018/05/word-image-4723.png 648w, /wp-content/uploads/2018/05/word-image-4723-300x178.png 300w" sizes="(max-width: 648px) 100vw, 648px" /></p>
<h3>4）并集（sunion）</h3>
<ul>
<li>
    语法：sunion 集合1 &#8230; 集合n
  </li>
<li>
    作用：合并去重
  </li>
<li>
    案例：
  </li>
</ul>
<p>
  张三：1,2,3
</p>
<p>
  李四：3,4,5
</p>
<p>
  合并：1,2,3,3,4,5
</p>
<p>
  去重：12345
</p>
<p><img loading="lazy" decoding="async" width="497" height="381" src="/wp-content/uploads/2018/05/word-image-4724.png" class="wp-image-5222" srcset="/wp-content/uploads/2018/05/word-image-4724.png 497w, /wp-content/uploads/2018/05/word-image-4724-300x230.png 300w" sizes="(max-width: 497px) 100vw, 497px" /></p>
<h3>5）交集（sinter）</h3>
<ul>
<li>
    语法：sinter 集合名1 &#8230; 集合名n
  </li>
<li>
    作用：相同数据
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="568" height="444" src="/wp-content/uploads/2018/05/word-image-4725.png" class="wp-image-5223" srcset="/wp-content/uploads/2018/05/word-image-4725.png 568w, /wp-content/uploads/2018/05/word-image-4725-300x235.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<h3>应用场景</h3>
<p>
  新浪共同的好友，你可能认识的好友
</p>
<h1>键（Key）操作</h1>
<h2>键是否存在（exists）</h2>
<p>
  语法：exists 键名
</p>
<p>
  说明：1-存在，0-不存在
</p>
<p><img loading="lazy" decoding="async" width="481" height="157" src="/wp-content/uploads/2018/05/word-image-4726.png" class="wp-image-5224" srcset="/wp-content/uploads/2018/05/word-image-4726.png 481w, /wp-content/uploads/2018/05/word-image-4726-300x98.png 300w" sizes="(max-width: 481px) 100vw, 481px" /></p>
<h2>键类型（type）</h2>
<p>
  语法：type 键
</p>
<p><img loading="lazy" decoding="async" width="453" height="171" src="/wp-content/uploads/2018/05/word-image-4727.png" class="wp-image-5225" srcset="/wp-content/uploads/2018/05/word-image-4727.png 453w, /wp-content/uploads/2018/05/word-image-4727-300x113.png 300w" sizes="(max-width: 453px) 100vw, 453px" /></p>
<h2>键查询 （keys *）</h2>
<ul>
<li>
    语法：keys *
  </li>
<li>
    说明：
  </li>
<li>
    查询所有键 			 keys *
  </li>
<li>
    查询指定开头键		keys 内容*
  </li>
<li>
    查询指定结尾键    keys *内容
  </li>
<li>
    查询包含键			keys *内容*
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="522" height="540" src="/wp-content/uploads/2018/05/word-image-4728.png" class="wp-image-5226" srcset="/wp-content/uploads/2018/05/word-image-4728.png 522w, /wp-content/uploads/2018/05/word-image-4728-290x300.png 290w" sizes="(max-width: 522px) 100vw, 522px" /></p>
<h2>随机键（randomkey）</h2>
<p>
  语法：randomkey
</p>
<p><img loading="lazy" decoding="async" width="442" height="369" src="/wp-content/uploads/2018/05/word-image-4729.png" class="wp-image-5227" srcset="/wp-content/uploads/2018/05/word-image-4729.png 442w, /wp-content/uploads/2018/05/word-image-4729-300x250.png 300w" sizes="(max-width: 442px) 100vw, 442px" /></p>
<h2>键更名（rename oldkey newkey）</h2>
<p>
  语法：rename 旧键 新键
</p>
<p><img loading="lazy" decoding="async" width="535" height="446" src="/wp-content/uploads/2018/05/word-image-4730.png" class="wp-image-5228" srcset="/wp-content/uploads/2018/05/word-image-4730.png 535w, /wp-content/uploads/2018/05/word-image-4730-300x250.png 300w" sizes="(max-width: 535px) 100vw, 535px" /></p>
<h2>键统计（dbsize）</h2>
<p>
  语法：dbsize
</p>
<p><img loading="lazy" decoding="async" width="424" height="347" src="/wp-content/uploads/2018/05/word-image-4731.png" class="wp-image-5229" srcset="/wp-content/uploads/2018/05/word-image-4731.png 424w, /wp-content/uploads/2018/05/word-image-4731-300x246.png 300w" sizes="(max-width: 424px) 100vw, 424px" /></p>
<h2>键设置过期时间（expire key 秒数  和 ttl key）</h2>
<p>
  语法1：expire 键 秒数
</p>
<p>
  含义1：设置指定键等待多久后过期
</p>
<p>
  语法2：ttl 键
</p>
<p>
  含义2：查看状态（-1 表示过期或者键不存在）
</p>
<p><img loading="lazy" decoding="async" width="607" height="148" src="/wp-content/uploads/2018/05/word-image-4732.png" class="wp-image-5230" srcset="/wp-content/uploads/2018/05/word-image-4732.png 607w, /wp-content/uploads/2018/05/word-image-4732-300x73.png 300w" sizes="(max-width: 607px) 100vw, 607px" /><br />
<img loading="lazy" decoding="async" width="550" height="411" src="/wp-content/uploads/2018/05/word-image-4733.png" class="wp-image-5231" srcset="/wp-content/uploads/2018/05/word-image-4733.png 550w, /wp-content/uploads/2018/05/word-image-4733-300x224.png 300w" sizes="(max-width: 550px) 100vw, 550px" /></p>
<h2>选择数据库（select）</h2>
<ul>
<li>
    语法：select  下标
  </li>
<li>
    说明：默认16个数据库，下标从0开始也就是最大小标是15
  </li>
</ul>
<p>
  配置文件
</p>
<p><img loading="lazy" decoding="async" width="491" height="132" src="/wp-content/uploads/2018/05/word-image-4734.png" class="wp-image-5232" srcset="/wp-content/uploads/2018/05/word-image-4734.png 491w, /wp-content/uploads/2018/05/word-image-4734-300x81.png 300w" sizes="(max-width: 491px) 100vw, 491px" /><br />
<img loading="lazy" decoding="async" width="500" height="308" src="/wp-content/uploads/2018/05/word-image-4735.png" class="wp-image-5233" srcset="/wp-content/uploads/2018/05/word-image-4735.png 500w, /wp-content/uploads/2018/05/word-image-4735-300x185.png 300w" sizes="(max-width: 500px) 100vw, 500px" /></p>
<h2>键移库（move）</h2>
<p>
  语法：move 旧键 数据库下标
</p>
<p>
  说明：将指定键移动到指定数据库中
</p>
<p><img loading="lazy" decoding="async" width="621" height="480" src="/wp-content/uploads/2018/05/word-image-4736.png" class="wp-image-5234" srcset="/wp-content/uploads/2018/05/word-image-4736.png 621w, /wp-content/uploads/2018/05/word-image-4736-300x232.png 300w" sizes="(max-width: 621px) 100vw, 621px" /></p>
<h2>键删除-当前库（flushdb）</h2>
<h2>键删除-全部库（flushall）</h2>
<p><img loading="lazy" decoding="async" width="566" height="529" src="/wp-content/uploads/2018/05/word-image-4737.png" class="wp-image-5235" srcset="/wp-content/uploads/2018/05/word-image-4737.png 566w, /wp-content/uploads/2018/05/word-image-4737-300x280.png 300w" sizes="(max-width: 566px) 100vw, 566px" /></p>
<h1>总结</h1>
<p>
  【字符串（string）类型】
</p>
<p>
  设置1个键：set  键 值
</p>
<p>
  设置n个键：mset 键1 值1 .. 键n 值n
</p>
<p>
  获取1个键：get  键
</p>
<p>
  获取n个键：mget 键1 .. 键n
</p>
<p>
  递增递减： incr 键  或  decr 键
</p>
<p>
  增加减少： incrby 键 数字 或者 decrby 键 数字
</p>
<p>
  拼接：	  append  键  内容
</p>
<p>
  截取:     substr 键 起始位置  结束位置 （注：含前含后，从0开始下标）
</p>
<p>
  【哈希（hash）类型】
</p>
<p>
  设置1个值：hset  键 字段  值
</p>
<p>
  设置n个值：hmset 键 字段1 值1 &#8230;字段n 值n
</p>
<p>
  获取1个值：hget  键 字段
</p>
<p>
  获取n个值：hmget 键 字段1 &#8230; 字段n
</p>
<p>
  检测字段： hexists 键 字段
</p>
<p>
  删除字段： hdel  键 字段
</p>
<p>
  字段个数： hlen 键
</p>
<p>
  所有键：	   hkeys
</p>
<p>
  所有值：   hvals
</p>
<p>
  所有键值： hgetall
</p>
<p>
  【列表（list）类型】
</p>
<p>
  左进：lpush 键 值   （返回压入后数据长度）
</p>
<p>
  右进：rpush 键值
</p>
<p>
  左弹：lpop 键	    （返回弹出的值）
</p>
<p>
  右弹：rpop 键
</p>
<p>
  查询：lrange 键 起始位置 结束位置（下标从0开始，-1表示倒数第一个  -2 表示第二个）
</p>
<p>
  【集合（set）类型】
</p>
<p>
  添加数据： sadd 集合名 值
</p>
<p>
  查看集合： smembers 集合名
</p>
<p>
  差集： sdiff  集合名1 .. 集合名n   （我有你没有）
</p>
<p>
  并集： sunion 集合名1 .. 集合名n   （合并去重）
</p>
<p>
  交集： sinter 集合名1 .. 集合名n    （共有的）
</p>
<p>
  【键（Key）类型】
</p>
<p>
  键是否存在： exists 键
</p>
<p>
  键类型：type 键
</p>
<p>
  键查询：keys *
</p>
<p>
  键随机：randomkey
</p>
<p>
  键更名：rename 旧键 新键
</p>
<p>
  键统计：dbsize
</p>
<p>
  键设置过期：  expire 键 时间/s
</p>
<p>
  查看过期时间：ttl 键 （-1表示不存在或者已经过期）
</p>
<p>
  选择数据库 ： select 索引
</p>
<p>
  键移库： move 键 索引
</p>
<p>
  删除当前库：flushdb
</p>
<p>
  删除所有库：flushall
</p>
<h1>Redis的持久化方式</h1>
<h2>概念</h2>
<p>
  说明：Redis持久化就是指数据当重启电脑后数据不会丢失
</p>
<p>
  原因：Redis开发者将数据在磁盘文件中保存了一份，当重启电脑时将数据加载到内存中。
</p>
<h2>Snapshotting快照持久化（默认）</h2>
<ul>
<li>
    快照模式将内存中的数据以快照的方式写入二进制文件中（dump.rbd）
  </li>
<li>
    通过修改配置文件（redis.conf）可以更改快照备份规则
  </li>
</ul>
<p>
  快照模式相对而言不够安全
</p>
<p><img loading="lazy" decoding="async" width="372" height="50" src="/wp-content/uploads/2018/05/word-image-4738.png" class="wp-image-5236" srcset="/wp-content/uploads/2018/05/word-image-4738.png 372w, /wp-content/uploads/2018/05/word-image-4738-300x40.png 300w" sizes="(max-width: 372px) 100vw, 372px" /><br />
<img loading="lazy" decoding="async" width="895" height="510" src="/wp-content/uploads/2018/05/word-image-4739.png" class="wp-image-5237" srcset="/wp-content/uploads/2018/05/word-image-4739.png 895w, /wp-content/uploads/2018/05/word-image-4739-300x171.png 300w, /wp-content/uploads/2018/05/word-image-4739-768x438.png 768w" sizes="(max-width: 895px) 100vw, 895px" /></p>
<h2>3、AOF持久化（Append only file）</h2>
<h3>1）概念</h3>
<p>
  AOF方式是只保存我们的写、修改、删除动作到文件中（appendonly.aof）当系
</p>
<p>
  统重启的时候会讲该文件中的数据重新加载到内存中。
</p>
<h3>︴如何开启AOF方式？</h3>
<ul>
<li>
    关闭快照备份
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="360" height="56" src="/wp-content/uploads/2018/05/word-image-4740.png" class="wp-image-5238" srcset="/wp-content/uploads/2018/05/word-image-4740.png 360w, /wp-content/uploads/2018/05/word-image-4740-300x47.png 300w" sizes="(max-width: 360px) 100vw, 360px" /><br />
<img loading="lazy" decoding="async" width="289" height="99" src="/wp-content/uploads/2018/05/word-image-4741.png" class="wp-image-5239" /></p>
<ul>
<li>
    开启AOF备份
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="310" height="59" src="/wp-content/uploads/2018/05/word-image-4742.png" class="wp-image-5240" srcset="/wp-content/uploads/2018/05/word-image-4742.png 310w, /wp-content/uploads/2018/05/word-image-4742-300x57.png 300w" sizes="(max-width: 310px) 100vw, 310px" /><br />
<img loading="lazy" decoding="async" width="487" height="46" src="/wp-content/uploads/2018/05/word-image-4743.png" class="wp-image-5241" srcset="/wp-content/uploads/2018/05/word-image-4743.png 487w, /wp-content/uploads/2018/05/word-image-4743-300x28.png 300w" sizes="(max-width: 487px) 100vw, 487px" /><br />
<img loading="lazy" decoding="async" width="656" height="119" src="/wp-content/uploads/2018/05/word-image-4744.png" class="wp-image-5242" srcset="/wp-content/uploads/2018/05/word-image-4744.png 656w, /wp-content/uploads/2018/05/word-image-4744-300x54.png 300w" sizes="(max-width: 656px) 100vw, 656px" /><br />
<img loading="lazy" decoding="async" width="864" height="326" src="/wp-content/uploads/2018/05/word-image-4745.png" class="wp-image-5243" srcset="/wp-content/uploads/2018/05/word-image-4745.png 864w, /wp-content/uploads/2018/05/word-image-4745-300x113.png 300w, /wp-content/uploads/2018/05/word-image-4745-768x290.png 768w" sizes="(max-width: 864px) 100vw, 864px" /></p>
<h1>八、安全性</h1>
<ul>
<li>
    问题：不需要密码就可以登录
  </li>
<li>
    解决：修改配置设置密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="480" height="123" src="/wp-content/uploads/2018/05/word-image-4746.png" class="wp-image-5244" srcset="/wp-content/uploads/2018/05/word-image-4746.png 480w, /wp-content/uploads/2018/05/word-image-4746-300x77.png 300w" sizes="(max-width: 480px) 100vw, 480px" /></p>
<p>
  脚下留心：记得重启服务
</p>
<ul>
<li>
    登录1：./redis-cli  -a  密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="609" height="297" src="/wp-content/uploads/2018/05/word-image-4747.png" class="wp-image-5245" srcset="/wp-content/uploads/2018/05/word-image-4747.png 609w, /wp-content/uploads/2018/05/word-image-4747-300x146.png 300w" sizes="(max-width: 609px) 100vw, 609px" /></p>
<ul>
<li>
    登录2：登录后，语法： auth 密码
  </li>
</ul>
<p><img loading="lazy" decoding="async" width="698" height="226" src="/wp-content/uploads/2018/05/word-image-4748.png" class="wp-image-5246" srcset="/wp-content/uploads/2018/05/word-image-4748.png 698w, /wp-content/uploads/2018/05/word-image-4748-300x97.png 300w" sizes="(max-width: 698px) 100vw, 698px" /></p>
<h1>九、主从复制（配置）</h1>
<h2>1、概念</h2>
<p>
  主从复制：当主服务器有写入/删除/修改数据动作，从服务器会自动同步
</p>
<p>
  读写分离：通过PHP控制器将增/改/删到主服务器，从服务器负责读取数据
</p>
<p><img loading="lazy" decoding="async" width="816" height="438" src="/wp-content/uploads/2018/05/word-image-4749.png" class="wp-image-5247" srcset="/wp-content/uploads/2018/05/word-image-4749.png 816w, /wp-content/uploads/2018/05/word-image-4749-300x161.png 300w, /wp-content/uploads/2018/05/word-image-4749-768x412.png 768w" sizes="(max-width: 816px) 100vw, 816px" /></p>
<h2>2、配置</h2>
<p><img loading="lazy" decoding="async" width="596" height="273" src="/wp-content/uploads/2018/05/word-image-4750.png" class="wp-image-5248" srcset="/wp-content/uploads/2018/05/word-image-4750.png 596w, /wp-content/uploads/2018/05/word-image-4750-300x137.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></p>
<p>
  从服务器端口和主服务器端口不能一直
</p>
<p>
  主服务器必须关闭防火墙
</p>
<p><img loading="lazy" decoding="async" width="364" height="338" src="/wp-content/uploads/2018/05/word-image-4751.png" class="wp-image-5249" srcset="/wp-content/uploads/2018/05/word-image-4751.png 364w, /wp-content/uploads/2018/05/word-image-4751-300x279.png 300w" sizes="(max-width: 364px) 100vw, 364px" /></p>
<h1>十、PHP与Redis结合</h1>
<h2>1、安装php的redis扩展</h2>
<h3>1）安装autoconf-2.62.tar.gz（依赖）</h3>
<p>
  /php/tools/
</p>
<p>
  tar  -zxvf  autoconf-2.62.tar.gz
</p>
<p>
  cd autoconf-2.62
</p>
<p>
  ./configure &amp;&amp; make &amp;&amp; make install
</p>
<p><img loading="lazy" decoding="async" width="861" height="219" src="/wp-content/uploads/2018/05/word-image-4752.png" class="wp-image-5250" srcset="/wp-content/uploads/2018/05/word-image-4752.png 861w, /wp-content/uploads/2018/05/word-image-4752-300x76.png 300w, /wp-content/uploads/2018/05/word-image-4752-768x195.png 768w" sizes="(max-width: 861px) 100vw, 861px" /></p>
<h3>安装phpredis</h3>
<p>
  #步骤1：安装扩展
</p>
<p>
  /php/tools
</p>
<p>
  tar -zxvf phpredis.tar.gz
</p>
<p>
  cd phpredis
</p>
<p>
  ./configure &#8211;with-php-config=/php/server/php/bin/php-config  #路径不同需要自己修改
</p>
<p>
  make &amp;&amp; make install
</p>
<p>
  #步骤2：让PHP加载redis.so扩展
</p>
<p>
  vi /php/server/php/lib/php.ini
</p>
<p><img loading="lazy" decoding="async" width="548" height="116" src="/wp-content/uploads/2018/05/word-image-4753.png" class="wp-image-5251" srcset="/wp-content/uploads/2018/05/word-image-4753.png 548w, /wp-content/uploads/2018/05/word-image-4753-300x64.png 300w" sizes="(max-width: 548px) 100vw, 548px" /></p>
<p>
  #步骤3：最后重启Apache即可
</p>
<p>
  /php/server/apache/bin/apachectl stop
</p>
<p>
  /php/server/apache/bin/apachectl start
</p>
<p>
  #步骤4：同步phpinfo检测是否安装成功
</p>
<p><img loading="lazy" decoding="async" width="1006" height="408" src="/wp-content/uploads/2018/05/word-image-4754.png" class="wp-image-5252" srcset="/wp-content/uploads/2018/05/word-image-4754.png 1006w, /wp-content/uploads/2018/05/word-image-4754-300x122.png 300w, /wp-content/uploads/2018/05/word-image-4754-768x311.png 768w" sizes="(max-width: 1006px) 100vw, 1006px" /></p>
<h2>通过php操作redis</h2>
<p>
  phpredis中文手册——《redis中文手册》 php版
</p>
<p><a href="http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html">http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html</a>
</p>
<p>
  &lt;?php
</p>
<p>
  #phpinfo();
</p>
<p>
  //1.创建redis对象
</p>
<p>
  $redis = new Redis;
</p>
<p>
  //2.连接Reids
</p>
<p>
  $redis-&gt;connect(&#8216;127.0.0.1&#8217;, 6379);
</p>
<p>
  //3.身份认证
</p>
<p>
  $redis-&gt;auth(1234);
</p>
<p>
  //4.添加数据
</p>
<p>
  $redis-&gt;set(&#8216;yaoyiyao&#8217;, &#8216;girl&#8217;);
</p>
<p>
  //5.获取数据
</p>
<p>
  echo $redis-&gt;get(&#8216;yaoyiyao&#8217;);
</p>
<h1>十一、TP中使用Redis</h1>
<p><img loading="lazy" decoding="async" width="1033" height="474" src="/wp-content/uploads/2018/05/word-image-4755.png" class="wp-image-5253" srcset="/wp-content/uploads/2018/05/word-image-4755.png 1033w, /wp-content/uploads/2018/05/word-image-4755-300x138.png 300w, /wp-content/uploads/2018/05/word-image-4755-768x352.png 768w, /wp-content/uploads/2018/05/word-image-4755-1024x470.png 1024w" sizes="(max-width: 1033px) 100vw, 1033px" /><br />
<img loading="lazy" decoding="async" width="525" height="548" src="/wp-content/uploads/2018/05/word-image-4756.png" class="wp-image-5254" srcset="/wp-content/uploads/2018/05/word-image-4756.png 525w, /wp-content/uploads/2018/05/word-image-4756-287x300.png 287w" sizes="(max-width: 525px) 100vw, 525px" /></p>
<p>
  脚下留心:tp只支持简单的设置获取删除
</p>
<h1>秒杀功能的实现（★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★）</h1>
<h2>架构示意图</h2>
<p><img loading="lazy" decoding="async" width="1252" height="515" src="/wp-content/uploads/2018/05/word-image-4757.png" class="wp-image-5255" srcset="/wp-content/uploads/2018/05/word-image-4757.png 1252w, /wp-content/uploads/2018/05/word-image-4757-300x123.png 300w, /wp-content/uploads/2018/05/word-image-4757-768x316.png 768w, /wp-content/uploads/2018/05/word-image-4757-1024x421.png 1024w" sizes="(max-width: 1252px) 100vw, 1252px" /></p>
<h2>代码</h2>
<h3>︴MySQL（问题：负库存）</h3>
<p>
  create database shop charset=utf8;
</p>
<p>
  use shop
</p>
<p>
  create table goods (id int primary key auto_increment,num int ) engine=innodb;
</p>
<p>
  insert into goods values (null, 100);
</p>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p>
  $conn = @mysql_connect(&#8216;192.168.21.134&#8242;,&#8217;test&#8217;,&#8217;admin888&#8242;);
</p>
<p>
  mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
  mysql_query(&#8216;use shop&#8217;);
</p>
<p>
  $sql = &#8220;select num from goods where id = 1&#8221;;
</p>
<p>
  $res = mysql_query($sql);
</p>
<p>
  $tmp = mysql_fetch_assoc($res);
</p>
<p>
  $num = $tmp[&#8216;num&#8217;];
</p>
<p>
  if (<strong>$num</strong>) {
</p>
<p>
  //减库存
</p>
<p>
  $sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
  mysql_query($sql);
</p>
<p>
  }
</p>
<p>
  echo &#8216;ok&#8217;;
</p>
<h3>实现步骤1：将商品放到队列中</h3>
<p>
  &lt;?php
</p>
<p>
  //1.创建redis对象
</p>
<p>
  $redis = new Redis();
</p>
<p>
  //2.连接服务器
</p>
<p>
  $redis-&gt;connect(&#8216;127.0.0.1&#8217;, &#8216;6379&#8217;);
</p>
<p>
  //3.登录（开启密码就写）
</p>
<p>
  $redis-&gt;auth(&#8216;1234&#8217;);
</p>
<p>
  //4.选择数据库
</p>
<p>
  $redis-&gt;select(0);
</p>
<p>
  //将商品ID=1的数据压入到redis队列中
</p>
<p>
  for($i=0; $i&lt;100; $i++){
</p>
<p>
      $redis-&gt;lpush(&#8216;goods1&#8217;, 1);
</p>
<p>
  }
</p>
<p>
  echo $redis-&gt;llen(&#8216;goods1&#8217;);
</p>
<h3>实现步骤3：Redis（队列处理）</h3>
<p>
  &lt;?php
</p>
<p>
  // 语法：ab -n 1000 -c 100 http://localhost/test/test.php
</p>
<p>
  // 说明：n &#8211; 请求总数 ,  c  &#8211; 并且
</p>
<p><strong>$redis=new Redis();</strong>
</p>
<p><strong>$redis-&gt;connect(&#8216;127.0.0.1&#8217;,6379);</strong>
</p>
<p><strong>$redis-&gt;auth(&#8216;123456&#8217;);</strong>
</p>
<p><strong>// 从头部弹出商品</strong>
</p>
<p><strong>$count=$redis-&gt;lpop(&#8216;goods1&#8217;);</strong>
</p>
<p>
  if($count){
</p>
<p>
      //连接数据库
</p>
<p>
      $conn = @mysql_connect(&#8216;127.0.0.1&#8242;,&#8217;root&#8217;,&#8217;admin888&#8242;);
</p>
<p>
      mysql_query(&#8216;set names utf8&#8217;);
</p>
<p>
      mysql_query(&#8216;use shop&#8217;);
</p>
<p>
      //减库存
</p>
<p>
      $sql=&#8221;update goods set num=num-1 where id = 1&#8243;;
</p>
<p>
      $data= mysql_query($sql);
</p>
<p>
      echo &#8216;ok&#8217;;
</p>
<p>
  }else{
</p>
<p>
      echo &#8216;error&#8217;;
</p>
<p>
  }
</p>
<h1>︴扩展：session入库（redis）</h1>
<h2>修改配置文件</h2>
<p><img loading="lazy" decoding="async" width="519" height="317" src="/wp-content/uploads/2018/05/word-image-4758.png" class="wp-image-5256" srcset="/wp-content/uploads/2018/05/word-image-4758.png 519w, /wp-content/uploads/2018/05/word-image-4758-300x183.png 300w" sizes="(max-width: 519px) 100vw, 519px" /><br />
<img loading="lazy" decoding="async" width="570" height="265" src="/wp-content/uploads/2018/05/word-image-4759.png" class="wp-image-5257" srcset="/wp-content/uploads/2018/05/word-image-4759.png 570w, /wp-content/uploads/2018/05/word-image-4759-300x139.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></p>
<p>
  &lt;?php
</p>
<p>
  ini_set(&#8220;session.save_handler&#8221;, &#8220;redis&#8221;);
</p>
<p>
  ini_set(&#8220;session.save_path&#8221;, &#8220;tcp://127.0.0.1:6379?auth=1234&#8221;);
</p>
<p>
  session_start();
</p>
</p>
<p>
  $_SESSION[&#8216;test_huangyihuang&#8217;] = 123;
</p>
<p>
  print_r($_SESSION);
</p>
<p>
  die;
</p>
<h2>通过设置用户自定义会话存储函数（session_set_save_handler）</h2>
<p>
  语法：session_set_save_handler（开启session机制函数，关闭session机制函数，
</p>
<p>
  读取session数据函数，写入session函数，销毁session函数，后手过期session函数）
</p>
<p>
  自 PHP 5.4 开始，可以使用SessionHandlerInterface接口实现（注：接口里面都是抽象方法）
</p>
<p>
  抽象类：有抽象方法的类就是抽象类
</p>
<p>
  抽象方法：用关键词abstract并且没有函数体的方法
</p>
<p>
  接口：特殊的抽象类（注：因为里面的方法都是抽象方法）
</p>
<p>
  redis.php
</p>
<p>
  &lt;?php
</p>
<p>
  	class RedisSessionHandler implements \SessionHandlerInterface
</p>
<p>
  	{
</p>
<p>
  		private $redis;
</p>
</p>
<p>
  		public static function start()
</p>
<p>
  		{
</p>
<p>
  			session_set_save_handler(new self, true);
</p>
<p>
  			session_start();
</p>
<p>
  		}
</p>
<p>
  		public function open($savePath, $sessionName) {
</p>
<p>
  			$this-&gt;redis = new Redis;
</p>
<p>
  			$this-&gt;redis-&gt;connect(&#8216;127.0.0.1&#8217;, 6379);
</p>
<p>
  			$this-&gt;redis-&gt;auth(&#8216;123&#8217;);
</p>
<p>
  			$this-&gt;redis-&gt;select(0);
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function close() {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function read($sessionId) {
</p>
<p>
  			return $this-&gt;redis-&gt;get( $sessionId ) ? : &#8221;;
</p>
<p>
  		}
</p>
<p>
  		public function write($sessionId, $data) {
</p>
<p>
  			return $this-&gt;redis-&gt;set($sessionId, $data);
</p>
<p>
  		}
</p>
<p>
  		public function destroy( $sessionId ) {
</p>
<p>
  			//$this-&gt;memcache-&gt;delete($sessionId)
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function gc( $lifetime ) {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
</p>
<p>
      RedisSessionHandler::start();
</p>
<p>
  	$_SESSION[&#8216;aa&#8217;] = 123;
</p>
<p>
  	$_SESSION[&#8216;bb&#8217;] = 456;
</p>
<p>
  	echo session_id();
</p>
<p>
  ?&gt;
</p>
<p>
  memcache.php
</p>
<p>
  &lt;?php
</p>
<p>
  	class MemcacheSessionHandler implements \SessionHandlerInterface
</p>
<p>
  	{
</p>
<p>
  		private $memcache;
</p>
<p>
  		public static function start()
</p>
<p>
  		{
</p>
<p>
  			session_set_save_handler(new self, true);
</p>
<p>
  			session_start();
</p>
<p>
  		}
</p>
<p>
  		public function open($savePath, $sessionName) {
</p>
<p>
  			$this-&gt;memcache = new Memcache();
</p>
<p>
  			$this-&gt;memcache-&gt;addServer(&#8216;127.0.0.1&#8217;, 11211);
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function close() {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function read($sessionId) {
</p>
<p>
  			return $this-&gt;memcache-&gt;get( $sessionId ) ? : &#8221;;
</p>
<p>
  		}
</p>
<p>
  		public function write($sessionId, $data) {
</p>
<p>
  			return $this-&gt;memcache-&gt;set($sessionId, $data, 0, 0);
</p>
<p>
  		}
</p>
<p>
  		public function destroy( $sessionId ) {
</p>
<p>
  			//$this-&gt;memcache-&gt;delete($sessionId)
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  		public function gc( $lifetime ) {
</p>
<p>
  			return true;
</p>
<p>
  		}
</p>
<p>
  	}
</p>
</p>
<p>
      MemcacheSessionHandler::start();
</p>
<p>
  	$_SESSION[&#8216;aa&#8217;] = 123;
</p>
<p>
  	$_SESSION[&#8216;bb&#8217;] = 456;
</p>
<p>
  	echo session_id();
</p>
<p>
  ?&gt;</p>
]]></content:encoded>
					
					<wfw:commentRss>/%e6%95%b0%e6%8d%ae%e5%ba%93/5175.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
