概述
redis是一种nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))。相关参考文档:http://redisdoc.com/index.html
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,数据不会丢失,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key-value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
简而言之redis是属于非关系型数据库,存储结构是:key-value,内存-磁盘的存储方式。
redis使用场景:
排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名的主播排名。还有一些文章阅读量的技术,或者新浪微博的点赞数等。
作为消息队列:比如celery就是使用redis作为中间人。
当前在线人数:还是之前的秀场例子,会显示当前系统有多少在线人数。
一些常用的数据缓存:比如我们的BBS论坛,板块不会经常变化的,但是每次访问首页都要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存起来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
好友关系:微博的好友关系使用redis实现。
发布和订阅功能:可以用来做聊天软件。
redis和memcached的比较:
redis日常操作
yum install redis -y
使用yum安装的redis版本是3.2的
使用 systemctl restart redis 启动
1.安装最新版本:centos7
wget http://download.redis.io/releases/redis-5.0.0.tar.gz
tar -zxvf redis-5.0.0.tar.gz
yum install gcc
yum install gcc-c++
mv redis-5.0.0 /usr/local/redis #移动redis
cd /usr/local/redis #切换目录
make #直接make编译安装
cp src/redis-server /usr/bin/ #复制文件
cp src/redis-cli /usr/bin/ #复制文件
修改配置文件
vi redis.conf
2.启动redis数据库服务
redis监听的是本机的6379端口,可以在配置文件中进行修改
[root@localhost redis]# redis-server redis.conf
ss -tnl
3.连接上redis-server:
redis-cli -p 6379 -h 192.168.202.6 # -h 后填写数据库服务器的ip
4.切换数据库
select index
index表示填写数字。redis的数据库用数字表示,0表示默认数据库,数据库最多可以有多少,可以通过配置文件redis.conf调试。默认是16个 ,范围是0-15
如:
5.添加:
set key value
如:
set name bai
将字符串值value关联到key
如果key已经持有其他值,
set命令就覆写旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。
6.查看value:
get key
如:get name
查看当前redis所有的key:
keys *
7.删除:
del key
如:
del name
8.设置过期时间
expire key timeout(单位为秒)
也可以在设置值的时候,一同指定过期时间:
set key value EX timeout
或:
setex key timeout value
查看过期时间
ttl key
如:
9.列表操作
在列表左边添加元素:
lpush key value
将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。
在列表右边添加元素:
rpush key value
将值value插入到列表key的表尾。如果key不存在,一个空列表会被创建并执行RPUSH操作。当key存在但不是列表类型时,返回一个错误。
查看列表中的元素:
lrange key start stop
返回列表key中指定区间内的元素,区间以偏移量start和stop指定,元素从左往右按0,1,2…的顺序排,从右往左按-1,-2,-3….的顺序排;如果要左边的第一个到最后的一个lrange key 0 -1。
通过下面的实验发现只能从左往右查不能从右往左查,(0 -1) 和(-5 -1)表示的含义是一样的,因此那种方法简单使用哪种,建议使用(0 -1)
移除列表中的元素:
移除并返回列表key的头元素:
lpop key
移除并返回列表的尾元素:
rpop key
指定返回第几个元素:
lindex key index
将返回key这个列表中,索引为index的这个元素。0为第一个元素1为第二个元素…..依此类推
获取列表中的元素个数:
llen key
如:
删除指定的元素:
lrem key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素。count的值可以是以下几种:
count > 0:从表头开始向表尾搜索,移除与value相等数量的元素,数量为count。
count < 0:从表尾开始向表头搜索,移除与 value相等数量的元素,数量为count的绝对值。
count = 0:移除表中所有与value 相等的值。
10.set集合的操作:
添加元素:
sadd set value1 value2....
查看元素:
smembers set
通过上边的实验发现集合有去重的作用
移除元素:
srem set member...
如:可一次移除多个
查看集合中的元素个数:
scard set
如:
获取多个集合的交集:
sinter set1 set2
如:
获取多个集合的并集:
sunion set1 set2
如:
获取多个集合的差集:
sdiff set1 set2
如:注意取值顺序,顺序不同可能差集不同
查看集合有哪些 keys *
删除集合 del set
如:
11.hash,哈希操作:
添加一个新值:
hset key field value
如:
将哈希表key中的域field的值设为value。
如果key不存在,一个新的哈希表被创建并进行 HSET操作。如果域 field已经存在于哈希表中,旧值将被覆盖。
获取哈希中的field对应的值:
hget key field
如:
删除field中的某个field:
hdel key field
如:
获取某个哈希中所有的field和value:
hgetall key
如:
获取某个哈希中所有的field:
hkeys key
如:
获取某个哈希中所有的值:
hvals key
如:
判断哈希中是否存在某个field:
hexists key field
如:
数字1表示存在,0表示不存在
获取哈希中总共的键值对:
hlen field
如:
12.事物操作:Redis事务可以一次执行多个命令,事务具有以下特征:
隔离操作:事务中的所有命令都会序列化、按顺序地执行,不会被其他命令打扰。
原子操作:事务中的命令要么全部被执行,要么全部都不执行。
开启一个事务:
multi
以后执行的所有命令,都在这个事务中执行的。
执行事务:
exec
会将在
multi
和
exec
中的操作一并提交。
通过实验当在终端1上开启事务,事务提交之前2号终端是看不到的,提交后两台终端都可看见
取消事务:
discard
会将
multi
后的所有命令取消。
通过实验发现取消事务后,事务中的操作,不会保存下来
监视一个或者多个key:
watch key...
监视一个(或多个)key,如果在事务执行之前这个(或这些) key被其他命令所改动,那么事务将被打断。
取消所有key的监视:
unwatch
13.发布/订阅操作:
给某个频道发布消息:
publish channel message
订阅某个频道的消息:
subscribe channel
先订阅频道 在发布