一.官网: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那一篇
- 比如,存用户信息
- 127.0.0.1:6379> set user:id:133:name lj
OK
127.0.0.1:6379> get 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}" 
- hash类型操作:(为指定的的键设定域值)
-
现在来实操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类型
-
扩展:key的时效性控制,即设置存活时间