Redis的基本介绍
Redis基本概念介绍和特性
1.1 Redis基本概念介绍
redis是Remote Dictionary Server(远程数据服务)的缩
由意大利人 antirez开发的一款内存高速缓存数据库
该软件使用C语言编写,它的数据模型为key-value
它支持丰富的数据结构(类型),比如String list hash set sorted set。
可持久化,保证了数据安全
- Redis是远程的,有客户端和服务端,我们一般说的是服务端;
- Redis是基于内存的,所以比基于硬盘的MySQL要快很多,但非常吃内存
- Redis是非关系型数据库。本质上也是数据库,但MySQL关系型数据库存储时必须定义数据字典,而Redis则不需要。
1.2 Redis和Memcached比较
- Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2. Redis支持master-slave(主从)模式应用。
3. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
4. Redis单个value的最大限制是1GB,memcached只能保存1MB的数据。
Redis
数据类型都支持push/pop
、add/remove
及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
与Memcached
一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave
(主从)同步。
1.3 Redis支持主从同步
数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis
可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性
和数据冗余
很有帮助。
二、Redis的应用场景
2.1 缓存
有两种类型:数据缓存、页面缓存(smarty)
使用缓存减轻数据库的负载。
在开发网站的时候如果有一些数据在短时间之内不会
发生变化,而它们还要被频繁访问,为了提高用户的请求
速度和减低网站的负载,就把这些数据放到一个读取
速度更快的介质上(或者是通过较少的计算量就可以
获得该数据),该行为就称作对该数据的缓存。
该介质可以是文件、数据库、内存,内存经常用于数据缓存。
缓存的两种形式:
页面缓存经常用在CMS(content manage system)内存管理系统里边
数据缓存经常会用在页面的具体数据里边
Redis常常作为数据缓存
当某些系统接口比较慢的时候,我们可以把一些数据放在Redis中缓存起来,下次取数据就不进行非常耗时的SQL操作了,直接从缓存中取数据,提升系统性能最常用的方法之一;
2.2 队列
push和pop操作保证了原子性的实现;
2.3 数据存储
所有的增删改查都是在Redis中进行,Redis有硬盘的持久化机制,定期进行存储,保证了数据的完整性和安全性。
查看redis客户端:which redis-cli
登录:redis-cli(默认登录本机6379端口)
info命令查看redis信息
Redis数据类型
在redis里边,除了\n和空额 不能作为名字的组成内容外,其他内容都可以作为key的名字部分。名字长度不做要求。
*exists key #测试指定key是否存在
del key1 key2 key3 #删除给定的key
*type key #返回给定的value的类型
keys pattern #返回匹配指定模式的所有key
rename oldkey newkey #改名字
*dbsize #返回当前数据库的key数量
expire key seconds #为key指定过期时间
*ttl key #返回key的剩余过期秒数
*select db-index #选择数据库,一共16个
move key db-index #将key从当前数据库移动到指定数据库
*flushdb #删除当前数据库中所有的key
flushall ¥删除所有数据库中所有的key
Redis数据类型
数据类型 | 存储的值 | 读写能力 |
---|---|---|
String | 可以是字符串、整数或浮点,统称为元素 | 对字符串操作对整数类型加减 |
List | 一个序列集合且每个节点都包好了一个元素 | 序列 两端推入、或弹出元素 修剪、查找或移除元素 |
Set | 各不相同的元素 | 从集合中插入或删除元素 |
Hash | 有key-value的散列组,其中key是字符串,value是元素 | 按照key进行删除或增加 |
Sort Set | 带分数的score-value有序集合,其中score为浮点,value为元素 | 集合插入,按照分数范围查找 |
3.1 String字符串类型的操作
功能:提供字符串或者整形操作。
set key value(string/int/float)
get key
incr string [value] //自加
decrby string [value] //自减
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片(二进制)或者序列化的对象。
单个value值最大上限是1G字节。
如果只用string类型,redis就可以被看作加上持久化的memchche。
3.2 List链表类型
功能:存储序列化集合,可用于队列,push和pop操作
lpush 左进
rpop 右进
llen key 查看list有几个元素
List类型是先进先出,适合队列;List不要求里面的元素是唯一的
(一)介绍
获得最新的10个登录用户信息:select * from user order by logintime desc limit 10;
以上sql语句可以实现用户需求,但是数据多的时候,全部数据都要受到影响,对数据库的负载较高。必要情况还需要给关键字段(id或logintime)设置索引,索引也比较耗费系统资源。
如果通过list链表实现以上功能,可以在list链表中只保留最新的10个数据,每进来一个新数据就删除一个旧数据。每次就可以从链表中直接获得需要的数据。极大节省各方面的资源消耗。
(二)应用
list类型其实就是一个双向链表。通过push,,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
- lrange key 0 -1 取出所有元素
- lrem key n/-n X 删除指定元素n次
- linsert key after/before key1 key2 在key1后/前插入key2.
- rpoplpush key1 key2 将key1右边key左入key2链表,原子性
功能:无序集合,每个元素都不一样
添加元素:sadd key value
判断有多少个元素:scard key
判断某个元素是否在set里面:sismember key value
删除某个元素:srem key value
获取全部值,并以数组方式返回:$redis->sMembers(‘dst’));
int(2)
array(2) {
[0]=>
string(1) “4”
[1]=>
string(1) “2”
}
3.3 Set类型
set
类型,无序的方式存储多个不同的元素,对元素可以进行快速的添加、查找和删除,相同的元素只算一个。
redis的set是string类型的无序集合。
set元素最大可以包含(2的32次方-1)个元素。
关于set集合类型除了基本的添加删除操作,
其他有用的操作还包含集合的取并集(union
),交集(intersection
),差集(difference
)。通过这些操作可以很容易实现sns中的好友推荐功能
。
注意:每个集合中的各个元素不能重复。
sadd key member #添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中,返回0,key对应的set不存在返回错误
srem key member [memeber] #从key对应set中移除给定元素,成功返回1
smove p1 p2 member #从p1 对应set中移除member并添加到p2对应set中
scard key #返回set的元素个数
sismember key member #判断member是否在set中
sinter key1 key2…keyn #返回所有给定key的交集
sunion key1 key2…keyn #返回所有给定key的并集
sdiff key1 key2…keyn #返回所有给定key的差集
smembers key #返回key对应set的所有元素,结果是无序的
3.4 hash类型
功能:存储的是
key-value
结构,key
必须是string
经常用于存储比较复杂的结构,Hash只要求键不一样,比如姓名,年龄等等
插入/修改:hset hash1 key1 12
获取:hget hash1 key1
查看hash
长度:hlen key
一次性获取:hmget hash1 key1 key2
数据类型Hash
hash
数据类型存储的数据与mysql
数据库中存储的一条记录极为相似
3.5 Sort Set排序集合类型
功能:存储是带分数的有序集合,经常用于排行榜
sort set 经常被用作排名例如 班级成绩排名
存储和hash一样,都是一个映射。存储的是分数与元素的映射。可以看出是排行榜
value必须全局唯一
score 是浮点型
sort set类型操作,如果两个元素的score一样,按照字节顺序排列先后
增加/修改:zadd zset1 10.1 val1
查看个数:zcard zset1
查看排名:zrange zset1 0 2 withscores
查看某个value排名:zrank zset1 val2
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个权。通过权值可以有序的获取集合中的元素。
该Sort se
t类型适合场合:
获得热门帖子(回复量)信息:select * from message order by backnum desc limit 5
;
(以上需求可以通过简单sql
语句实现,但是sql
语句比较耗费mysql
数据库资源)
for example:
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> zadd hotmessage 102 11 //添加
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 141 12
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 159 13
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 72 14
(integer) 1
127.0.0.1:6379[2]> zadd hotmessage 203 15
(integer) 1
127.0.0.1:6379[2]> keys *
- “hotmessage”
127.0.0.1:6379[2]> zrevrange hotmessage 0 100
//按照权由高到低的顺序获得具体元素值的信息- “15”
- “13”
- “12”
- “11”
- “14”
127.0.0.1:6379[2]> zadd hotmessage 189 16
(integer) 1
127.0.0.1:6379[2]> zrevrange hotmessage 0 100- “15”
- “16”
- “13”
- “12”
- “11”
- “14”
127.0.0.1:6379[2]> zremrangebyrank hotmessage 0 0
(integer) 1
//把权最低的那个删掉 0 0表示删除第一个权;0 1表示删除第一个,第二个权;
127.0.0.1:6379[2]> zrevrange hotmessage 0 100- “15”
- “16”
- “13”
- “12”
- “11”
127.0.0.1:6379[2]> zrank hotmessage 12
//权由低到高获得元素排名
(integer) 1
127.0.0.1:6379[2]> zrank hotmessage 11
(integer) 0
127.0.0.1:6379[2]> zrevrank hotmessage 13
//权由高到低获得元素排名
(integer) 2
127.0.0.1:6379[2]> zcard hotmessage
//获得集合中元素个数
(integer) 5
127.0.0.1:6379[2]> zscore hotmessage 16
//根据元素值获得对应的权
“189”
127.0.0.1:6379[2]> zincrby hotmessage 100 12
//给指定的元素值增加一些权信息
“241”
127.0.0.1:6379[2]> zrevrange hotmessage 0 100- “12”
- “15”
- “16”
- “13”
- “11”
127.0.0.1:6379[2]>
四、持久化操作
Redis
为了内部数据的安全考虑,会把本身的数据以文件形式
保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis
)的里边。数据保存到硬盘的过程就称为持久化
效果
相关指令:
./redis-cli bgsave //异步保存数据到磁盘(快照保存)
./redis-cli 1h 127.0.0.1 -p 6379 bgsave
./redis-cli lastsave //返回上次成功保存到磁盘的unix时间戳
./redis-cli shutdown //同步保存到服务器并关闭redis服务器
./redis-cli bgrewriteaof //当日志文件过长时优化AOF日志文件存储
五、Redis的主从模式
5.1 使用背景
为了降低每个redis服务器的负载,可以多设置几个服务器,并做主从模式 一个服务器负载“写”(添加、修改、删除)数据,其他服务器负载“读”数据。主服务器数据会“自动”同步给从服务器。
六、创建连接redis的客户端
连接redis:
创建connect.php文件
<?php $redis = new \Redis(); //实例化 $redis->connect('127.0.0.1',6379);
//string操作
$redis->delete(“string1”);
$redis->set(“string1”,“val1”);
$val = val); //val1
$redis->set(“string1”,4);
$redis->incr(“string1”,2);
$val = val); //6