4、sets类型及操作
set是集合,它是string类型的无序集合。set是通过hash table实现的、添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。
(1)sadd
向名称为key 的set中添加元素。
语法:sadd 集合名 元素
(2)smembers 获取集合中内容,语法:smembers 集合名称
(3)srem
删除名称为key的set中的元素.
(4)spop
随机返回并删除名称为key的 set中一个元素。
(5)sdiff
返回所有给定key与第一个key的差集。
(6)sdiffstore
返回所有给定key与第一个key的差集,并将结果存为另一个key。
语法:sdiffstore 新的集合 集合1 集合2
(7)sinter
返回所有给定key的交集.
(8)sinterstore
返回所有给定key的交集,并将结果存为另一个key
(9)sunion
返回所有给定key的并集
(10)sunionstore
返回所有给定key的并集。
(11)smove
从第一个key对应的set中移除member并添加到第二个对应的set中。
(12)scard
返回名称为key的set的元素个数。
(11)sismember
测试member是否是名称为 key的set的元素
(12)srandmember
随机返回名称为key的set的一个元素,但不删除元素
5、sorted sets类型及操作
sorted set是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作中的key理解为zset的名字。
(1)zadd
向名称为key的zset中添加元素。如果该元素存在,则更新其顺序。
语法:zadd 集合名 序号 内容
(2)zrange
获取有序集合中的内容
(3)zrem
删除名称为key的zset中的元素member。
(4)zincrby
如果在名称为key的zset中已经存在元素member,则该元素的score增加increment否则向该集合中添加该元素,其score的值为increment。
(5)zrank
返回名称为key的zset中member元素的排名(按score从小到大排序)即下标。
(6)zrevrank
返回名称为key的zset中member元素的排名(按score从大到小排序)即下标。
(7)zrevrange
返回名称为key的zset(按score从大到小顺序)中的index从start到end的所有元素。
(8)zrangebyscore
返回集合中score在给定区间的元素
(9)zcount
返回集合中score在给定区间的数量。
(10)zcard
返回集合中元素的个数
(11)zremrangebyrank
删除集合中排名在给定区间的元素。
(12)zremrangebyscore
删除集合中score在给定区间的元素。
6、redis常用命令
redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在linux终端使用。
1、键值相关的命令
(1)keys
返回满足给定参数的所有key
用表达式*,代表取出所有的key
(2)exists
确认一个key是否存在。
(3)expire
设置一个key的过期时间
(4)move:
将当前数据库中的key转移到其它数据库中。
(5)persist
移除给定key的过期时间
(6)randomkey
随机返回key空间的一个key
(7)rename
重命名key
(8)type:返回值的类型
2、服务器相关命令
(1)select
选择数据库。redis数据库编号从0-15,我们可以选择任意一个数据库来进行数据的存取。
当选择16时,报错,说明没有编号为16的这个数据库。
(2)quit
退出连接
(3)dbsize
返回当前数据库中key的数目
(4)info
获取服务器的信息和统计。
(5)config get
获取参数的配置。
本例中我们获取了dir这个参数配置的值,如果想获取全部参数的配置只需要执行”config get *”即可将全部的值都显示出来
(6)flushdb
删除当前选择数据库中的所有key
(7)flushall
删除所有数据库中的所有的 key
六、安全性(设置密码)
设置客户端连接后进行任何其他操作前需要使用的密码。
注意:因为 redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
方法:打开配置文件redis.conf,
语法:
requirepass 设置的密码
requirepass guangzhou
密码验证方式有两种:
第一种:在客户端登录后,在执行某些操作时,执行auth 输入设置密码
第二种:在客户端登录时,执行验证,
redis-cli -a 输入设置的密码
七、持久化的方式:
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
redis支持两种持久化方式:
1、snapshotting(快照)默认方式
rdb的工作原理:
每隔N分钟或N次写操作后,
从内存dump数据形成rdb文件,
压缩
放在备份目录
save 900 1 #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。
save 300 10 #必须是300秒之后至少10个键的值发生变化。
save 60 10000 #必须是60秒之后至少10000个键的值发生变化。
(以上3个选项都屏蔽,则rdb禁用)
stop-writes-on-bgsave-error yes #后台存储错误停止写。
rdbcompression yes #使用LZF压缩rdb文件。
rdbchecksum yes #存储和加载rdb文件时校验。
dbfilename dump.rdb #设置rdb文件名。
dir ./ #设置工作目录,rdb文件会写入该目录。
2、append-only file( 缩写aof)的方式
aof方式
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。
可以通过配置文件告诉reids我们想要通过fsync函数强制os写入到磁盘的时机。
appendonly yes //启用 aof 持久化方式
appendfilename appendonly.aof //保存命令的文件名称
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖 os,性能最好,持久化没保证
no-appendfsync-on-rewrite no #重写aof时同步最新数据
aof重写:内存中的数据,逆化成命令,写入到.aof日志里面。以解决aof日志过大过程中。
auto-AOF-rewrite-percentage 100 当前aof文件是上次重写是增加N%时重写
auto-AOF-rewrite-min-size 64mb aof重写至少要达到的大小
64M =è50M 100M =è80M(重写后)
第一次重新完成: 第二次重到100M 第三次重写160M
手动完成重写:bgrewriteaof
注意点:
两种备份方式可以同时使用,而且推荐这么做。
恢复时,rdb和aof哪个恢复的块。
rdb快,因为rdb数据是内存的映射,直接载入到内存,而aof是命令,需要逐条执行。
八、php支持redis
1、准备扩展文件。扩展文件要和php的版本一致,具体是vc几的,是否是ts的或nts的。
2、把扩展拷贝到php的安装目录下面的ext目录下面。
3、打开php.ini文件,配置加载扩展,(重启apache)
4、通过phpinfo函数进行测试。
入门案例使用:
九、案例:
用户注册 用户登录 用户的删除和修改 分页显示用户 添加用户的好友
register.php用户注册页面,
思考:如何来存储用户的具体信息,使用哈希,构造一个用户键
user:id
index.php 首页面,用于显示用户列表页面。
del.php 用于删除用户,要注意删除 哈希键 ,还要删除链表里面用户的id
login.php:用户登录的页面,
loginok.php处理用户登录的页面:
接收到$username 和 $password 如何验证用户合法呢?
用户的数据是存储到哈希里面,哈希的键user:id
思路:根据用户输入的用户名,获取到用户的id,根据id从哈希里面获取用户的密码,该密码再和用户输入的密码进行比较。
在用户注册时,通过设置一个字符串,该字符串用于存储用户的id.
字符串的键:如何设计:’username:’.$username,$userid
addfield.php 添加好友页面,