一、理论部分
1.什么是redis
Redis(Remote Dictionary Server ),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value结构型数据库,nosql(非关系型数据库中最为常用)的一种,主要用来存储,端口号:6379
2.数据结构
redis是一个key-value存储系统。key为string类型,value类型有string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
3.特点
1》支持持久化
2》丰富的数据类型
3》数据备份 主从同步
4》具有原子性,并且还支持几个操作合并后的原子性执行
5》读写性能效率极高, 读的速度是110000次/s,写的速度是81000次/s ;
4.导致redis那么“快”(高效)的原因
1》完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
2》数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
3》采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
4》使用多路I/O复用模型,非阻塞IO;
5》使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
注:多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。
这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。
5.扩展
1、单进程多线程模型:MySQL、Memcached、Oracle(Windows版本);
2、多进程模型:Oracle(Linux版本);
3、Nginx有两类进程,一类称为Master进程(相当于管理进程),另一类称为Worker进程(实际工作进程)。启动方式有两种:
(1)单进程启动:此时系统中仅有一个进程,该进程既充当Master进程的角色,也充当Worker进程的角色。
(2)多进程启动:此时系统有且仅有一个Master进程,至少有一个Worker进程工作。
(3)Master进程主要进行一些全局性的初始化工作和管理Worker的工作;事件处理是在Worker中进行的。
二、实践部分
数据类型:
一》.string类型
1. 简介:字符串(string)是Redis最基本的类型,可以存储String,Integer,Float型的数据,甚至是二进制数据,一个string类型的value值最大容量是512M
2 .set命令
key具有唯一性,写入数据时如果不存在key即为创建,已存在同名的key即为修改
2.1 设值
语法:set key value
set name zhangsan
2.2 设置过期时间
语法:setex key seconds value
setex pwd 30 123
这里的time为该键值对的生命周期,达到生命周期后该数据就会自动销毁
3.get命令
3.1获取单个值
语法:get key
get name
3.2获取多个值命令
语法:mget key1 key2 key3...
mget name1 name2 name3
4.del命令(删除命令)
4.1删除单个键
语法; del key
del name
4.2删除多个键
语法; del key1 key2
del name1 name2
4.3keys查找命令
keys *
5.exists命令(判断键是否存在,如果存在返回1,不存在返回0)
exists age
6.type命令(查看键对应值的类型)
语法:type key
type name
7.expire 命令(设置键过期时间)
语法:expire key seconds
set age 22 //先创建一个键值对,此时有效期期为长期,时间显示为-1 expire age 30 //给该键值对设置存活时间
设置了过期时间后该生命周期开始倒计时,为0后该数据在库中消失
注:setex key seconds value 是创建时就设置生命周期 而expire key seconds是修改已存在的数据的生命周期,注意区分;如果给一个不存在的数据设置生命周期也是会报错的,哪怕给定value也不行,如下图
8.TTL命令(查看键的有效时间)
语法:ttl key
以秒为单位返回key的剩余生存时间
返回值:
当key不存在时返回-2
当key存在但没有设置生命周期时返回-1
否则以秒为单位返回key的剩余生存时间
//设置密码
set password1 123
//设置有效时长为60s的密码
setex password2 60 456
//查看未设有效时长的密码的剩余时间
ttl password1
//查看已设有效时长的密码的剩余时间
ttl password2
//查看不存在的密码的有效时长
ttl password3
二》.List类型
1.简介
1.1列表中的值(value)类型为字符串;
1.2字符串List,底层实现上不是数组,而是链表,也就是说在头部和尾部插入一个新元素,其时间复杂度是常数级别的;其弊端是:元素定位比数组慢
2.添加(返回值为插入列表的元素的长度)
从左侧插入值:lpush key value1 value2 value3...
从右侧插入值:rpush key value1 value2 value3...
注意:最右侧为起始位置,后续每添加一个新的value都是添加到左边
同理:最左侧为起始位置,后续每添加一个新的value都是添加到右边
//从左侧插入
lpush a 1 2 3
//从右侧插入
rpush c 4 5 6
3.获取
返回列表指定范围内的值
1》索引从左侧开始,第一个值的索引为0
2》索引可以为负数,表示从尾部开始计数,如-1表示最后·一个值,-2为倒数第二个值,依此类推
3》start,stop为要获取值的索引
语法:lrange key start stop
//设置一个列表注入元素
rpush test a b c d e f g
//获取列表所有值
lrange test 0 -1
//从第四个元素开始获取到最后的值
lrange test 3 -1
4.修改(修改指定索引位置的值)
语法:lset key index value
//将列表中第三个value值更改为“123”
lset test 2 123
5.删除
删除指定值
5.1》删除列表中count个值
5.2》count>0表示从左(上)往右(下)删除
5.3》count
5.4》count=0表示删除所有指定的value
语法:lrem key count value
//新建一个number表
rpush number 1 2 3 1 2 3 1 4 3
//查询表
lrange number 0 -1
//从右侧删除一个1
lrem number -1 1
//查询表
lrange number 0 -1
//从左侧删除2个3
lrem number 2 3
//查询表
lrange number 0 -1
//删除所有2
lrem number 0 2
//查询表
lrange number 0 -1
显示结果为:
三》.Set类型
1.简介
set字符串的元素(value)具有唯一性和无序性,是通过HashTable实现的
2.sadd添加元素
语法:sadd key value1 value2 value3...
3.smembers 查询所有元素
语法:smembers key
4.sismember判断元素是否在集合中
语法:sismember key value
存在则返回“1”,不存在返回“0”
5.srem删除元素
语法:srem key value1 value2 value3...
6.scard 获取集合的长度(元素的个数)
语法:scard key
7.spop弹出元素(因为set集合中的元素是无序的所以是随机弹出)
语法:spop key count
注意:可以把弹出元素理解成删除的一种方式,区别在于srem删除的返回值类型是被删除元素的数量,而spop弹出的返回值类型是被弹出的value值
8.smove 移动元素
语法:smove source destination member(如果destination不存在则默认先创建再移动)
//1.新建一个set集合
sadd age a b c d
//2.查询所有元素
smembers age
//3.判断元素e是否在集合中
sismember age e
//4.删除元素a
srem age a
//5.获取集合长度
scard age
//6.随机弹出两个元素
spop age 2
//7.查询所有元素
smembers age
//8.将查询出来的最后一个元素移动到time集合中(这里我们没有创建time集合所以会自动创建一个再移动,注:下面的x元素是代指第七步查出来的元素)
smove age time x
//此时age集合没有元素后键也失去了意义所以age集合直接消亡了
四》.Hash 哈希类型
1.简介
以Hash形式存放字符串
2.hset设置值
语法:hset key field value
3.hmset同时设置多对值
语法:hmset key field1 value1 field2 value2....fieldn valuen
4.hgetall获取键中所有值
语法:hgetall key
5.hget获取键中单个field的值
语法:hget key fieldx
6.hget同时获取多个field的值
语法:hget key fieldm fieldn....
7.hdel删除 field
语法:hdel key field
删除多个 field
hdel key field1 field 2.....
//设置多对值
hmset boy name tim age 15 hight 166 weight 43
//获取boy中所有的值
hgetall boy
//获取boy的name和age
hmget boy name age
//删除boy的age和weight
hdel boy age weight
//获取boy中所有的值
hgetall boy
结果如下:
五》.zset/sorted set类型(有序集合)
1.zadd添加元素
语法:zadd key score value1 score value2 ....score valuen
注:score和value可以是多对,score可以是整数,也可以是浮点数,还可以是+inf表示正无穷大,-inf表示负无穷大
新增元素都是从左边添加
2.zrange 获取区间内的元素
语法:zrange key start stop [withscores]
3.zrangebyscore获取分数区间内的元素
语法:zrangebyscore key min max [withscore]
4.zrem 删除元素
语法:zrem key member1 member2....membern
5.zcard 获取集合的长度(集合中元素的个数)
语法:zcard key
//添加多个元素
zadd math 99 zs 88 ls 77 ww 66 zl 55 ak
//获取第二个到倒数第二个的value和分数
zrange math 1 -2 withscores
//获取分数在70-90之间的value和分数
zrangebyscore math 70 90 withscores
//删除zs
zrem math zs
//获取math长度
zcard math
结果: