一.官网:redis.io
- Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持
-
基本介绍
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便
二.概念:是一个基于c语言编写的键值数据库,nosql。
- 是目前最流行的键值对存储数据库
- Redis是一个nosql数据库
- Redis服务的默认端口是:6379
- 特点
- 读写极佳:Redis是基于内存的,读的速度110000次/s,写81000/s
- 支持数据持久化:数据在内存当中使缺乏持久性的,服务器一旦宕机或断电,内存中的数据就会丢失,但是Redis是支持数据持久化的,可以将内存中的数据保存在磁盘中,在服务器宕机或者重启时,可以重新读取使用
- 支持多种数据结构:Redis不仅提供了key-value类型的数据,同时还提供了list,set,zset,hash等数据结构的存储
- 支持数据备份:Redis支持数据的备份,就是指master-slave模式的数据备份,主从同步
- 具有原子性:原子性就是指要么成功,要么失败完全不执行,单个操作和多个操作都支持事物的原子性
- 架构灵活:业务较少的时候使用主从即可满足需求,业务繁多时,大多采用集群架构,弥补了内存原因导致处理数据量有限的情况
- 功能丰富:支持publish/subcribe(发布和订阅),通知,key过期等特性
- 单线程:可以避免上下文切换和竞争条件,也不存在多进程和多线程导致的切换而消耗CPU,不用考虑各种锁的问题,不存在加锁和释放锁的操作,不可能因为死锁而导致的性能消耗
-
Redis的应用场景:
- 热点数据缓存
- 热点数据(经常被查询,但不经常被修改或者删除的数据),由于Redis访问速度快,支持的数据类型丰富,是首选使用的缓存
- 计数器
- 用来对商品的购买,视频播放,文章阅读等数据的计数,这样可以确保数据的实时性Redis读写性能极佳,所以非常适合计数场合
- 消息队列
- 一些访问或者点击量较高的网站中,Redis是不可或缺的中间件,主要用于流量消峰,异步处理实时性低的业务(但是相比专门的中间件会差一点)
- 还有一些功能如:好友列表,聊天室,排行榜,秒杀,抢购,数据过期处理等等
- 热点数据缓存
-
Redis的缺点:
- 受限于硬件:Redis数据的容量受限于物理内存,这导致了单个Redis无法用于较大数据量的操作和运算上。这个缺点可以通过主从或者集群来解决
- 无法发挥多核CPU
- 因为Redis是采用单线程运行,在调试CPU的时候,也只是会采用单核,因此无法发挥多核CPU的性能
- 可以通过单机多台Redis实现
- 缓存雪崩
- 大量key同时间点失效,同时又有大量请求打进来,导致流量直接打在DB上,导致DB不可用
- 缓存穿透:
- 用户大量并发请求的数据(key)对应的数据在Redis和数据库中都不存在,导致尽管数据不存在但还是每次都会进行查DB
- 解决办法:可以为空数据进行缓存或者使用过滤器
-
nosql数据库是什么?
- nosql数据库的产生主要就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题。
- 在项目当中,Redis处于哪个位置:
以上是通过百度和资料对Redis有了一个简单的认识和了解,
那么我们现在来进行实操,我们还是通过SecureCRT这个远程操作软件,不熟的可以去看Linux那一篇
- 新建redis
- 1.先要安装了wget: yum install -y wget(我在Linux那一篇已经安装过了)
- 再安装Redis
- 2.下载Redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz
- tar.gz: 指的是在linux下面的压缩文件
- 4.解压 注意:-C是大写
tar -zxf redis-5.0.0.tar.gz -C /usr/local/,如果不一步到位,还需要移动文件,麻烦 - 5.在解压目录下,编译
- make 编译是需要C语言的相关支持的,
- 如果没有,需要先去安装 yum install gcc-c++
- 6.安装,也是在解压目录中执行 make install
- 安装好之后,
- 进入src
- cd src/ 或者 ll redis-*(只看Redis开头的)
- 以及关注[root@localhost redis-5.0.0]下的 redis.conf这个文件
- 7.为redis-5.0.0建立快链(只是用另一个名字指向他,这个太长了),
- 先要回到local目录下
[root@localhost local]# ln -s redis-5.0.0/ redis (名字叫做redis)
查看ll可以看到:
lrwxrwxrwx. 1 root root 12 9月 20 09:27 redis -> redis-5.0.0/ - 用redis就可以直接访问 [root@localhost local]# cd redis
- 先要回到local目录下
- 8.在src目录下启动redis
- [root@localhost src]# redis-server 出现下图这样就启动完毕了
- 9,查看运行进程
-
ps -ef | grep redis
-
ps 命令的作用是显示进程信息
-e: 显示所有进程
-f:全格式
grep:使用正则表达式搜索文本,后把匹配的行显示出来
-
-
10,开启客户端:
-
[root@localhost src]# redis-cli
127.0.0.1:6379>
-
- 11,设置key,value
- 127.0.0.1:6379> set name zs
- 取值:
127.0.0.1:6379> get name - 对于没有的key,返回 nil
- 如果要查看帮助,用help + 命令
- 127.0.0.1:6379> help get
- help @(此时按tab键,会不断的切换string,list...等)
- 寻找帮助,用tab, help 空格tab
- 清屏 clear
- 退出: ctrl+c
- 类似于 i++ i--的操作:(可以当成缓存数据库来用)
- 单词:increment
- incr
- 类似于i+=100, i=i+100的操作:
- incrby num 100
- 类似于i--的操作
- decr
- 类似于 i-=10 的操作
- decrby
- 如果没有key,则value从0开始,这里num2没有定义
- 时间到计时,key只能存指定时间
- setex t1 10 hello
-
- 设置验证码300秒
- 比如,存用户信息
- 127.0.0.1:6379> set user:id:133:name lj
OK
127.0.0.1:6379> get user:id:133:name
"lj"
- 127.0.0.1:6379> set user:id:133:name lj
- 把value弄个json,进行存取(一次性存多一些)
- 127.0.0.1:6379> set user:id:135 '{"name":"zsf","gender":"na","age":22}'
OK
127.0.0.1:6379> get user:id:135
"{\"name\":\"zsf\",\"gender\":\"na\",\"age\":22}"
- 127.0.0.1:6379> set user:id:135 '{"name":"zsf","gender":"na","age":22}'
- hash类型操作:(为指定的的键设定域值)
- 存取:127.0.0.1:6379> hset user:123 name zs
(integer) 1
127.0.0.1:6379> hset user:123 age 23
(integer) 1
127.0.0.1:6379> hget user:123 name
"zs"
127.0.0.1:6379> hget user:123 age
"23"
127.0.0.1:6379> hgetall user:123
1) "name"
2) "zs"
3) "age"
4) "23"
127.0.0.1:6379> - 删除:hdel
-
- 长度:hlen
-
- 一次性多个值赋值(一对一对来)
- hmset user:123 address hz email abc tele 1234567
- 给h1这个键的属性a的值+100,再-1000(i+=100,i-=1000)
- 从h1这个键里面去查这个键的所有域,查某个键下的所有域的值
-
其实就是hash类型当中有键和值,但是hash中的值是由域和值组成的,此时键就类似于对象,域值就类似于属性和属性的值
-
- hvals
- hkeys
- 永旺办卡案例
-
- 存取:127.0.0.1:6379> hset user:123 name zs
-
现在来实操list链表类型
- 添加 lpush list1 zs ls ww zl
- 查询 lrange list1 0 3
- 这个链表是队列:队列的数据结构是从坐到右,先进在右,先进后出,后进先出
- lpush rpush 说明往列表里面加数据的时候,是有方向性的
- 从列表中取数据
- lpop list1 rpop list1 往左或者往右取第一个
- lindex list1 0 取指定的数据
- llen list1 显示列表长度
- 从列表中删除 指定个数的 某个值
-
lrem list2 3 d
-
-
- 从列表移出并获取列表第一个元素
- blpop a 5 在5s内移出并获取到链表a的第一个元素,并且在这5s内会阻塞你输入其他命令 :如果链表内还有数据,就不会阻塞,如果没有,就会阻塞你设定的时间
-
set类型
- 添加
- sadd set1 a
- 查看所有元素
- smembers set1
- 查看集合长度
- scard set1
- 查看集合当中是否有某个元素
- sismember set1 e
-
- 交集,
- sinter s1 s3
- 并集
- sunion s2 s3
- 差集
- sdiff s1 s2 表示在s1而不在s2当中的元素
- 将某些集合的交集放到某个集合
- sinterstore s5 s1 s2
- 添加
-
扩展:key的时效性控制,即设置存活时间
- 查看倒计时秒数:ttl
- 查看倒计时毫秒数: pttl
- 设置 元素的倒计时 setex cc 100 123 设置存活时间为100秒,同时设值为123
- 先设置了元素的值之后,再加倒计时
- expire
-
- 在值的存活时间内,将暂存变为永久
- persist pp
-
查看键
-
- ?代表一个
- * 代表任意多个