Redis入门
文章目录
看慕课网的视频, 同时写下的笔记
NoSQL的概述
NoSQL= Not Only SQL
为什么需要NoSQL?(补充关系型数据库的不足)
- 高并发读写–High performance(朋友圈、 新浪微博)
- 海量数据的高效率存储和访问–Huge Storage
- 高扩展性和高可用性–High Scalability && High Availability
NoSQL的例子:MongoDB Redis Membase等
NoSQL的四大分类
- 键值存储(Redis, memcache, Riak)
- 列存储(Cassandra, Hbase)
- 文档数据库(mongoDB, CouchDB)
- 图形数据库(neo4j)
NoSQL的特点
- 易扩展
- 大数据量,高性能
- 灵活的数据模型
- 高可用
Redis概述
Redis的由来
一个意大利人不满Mysql的性能,用C语言为自己的公司量身定做的一个数据库,并且进行开源。
Redis支持的数据类型
高性能的键值对的数据库,支持的键值数据类型
- 字符串类型 String
- 集合类型 Set
- 列表类型 List
- 散列类型 Hash
- 有序集合类型 Sorted-Set
Redis的应用场景
- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理
- 应用排行榜
- 分页式Session
Redis的安装和使用
搭建环境
- 虚拟机: VMware
- Linux系统:CentOS
- 连接工具:SecureCRT,FileZilla
运行命令安装c语言运行环境:yum install gcc-c++
- 将文件放入 root 目录中并解压
- 使用make命令进行编译
- 安装 make PREFIX=/usr/local/redis install
- cd /usr/local/redis/bin
ls 命令查看目录, 可以看到- benchmark 性能测试的工具
- heck-aof caof修复工具
- check-dump 文件检查的工具
- cli 命令行的客户端
- sentinel
- server 服务器启动
- 回到编译时的目录中,进入redis,找到文件redis.conf
- 把这个redis.conf文件拷贝到安装目录下
- 命令: cp redis.conf /usr/local/redis
- 可以开始启动redis,进行bin目录,运行 ./redis-server 属于前端启动,但是不能做其他操作了,使用ctrl + c停止
- 要使用后端启动要修改配置文件 vim redis.conf ,修改配置文件,把 daemonize no 变成 daemonize yes
- 再使用./bin/redis-server ./redis.conf 命令,后端启动。
- 可以通过 ps -ef | grep -i redis 来查看端口
- 停止redis: kill - 9 4684 (不推荐使用)
- 一般使用./bin/redis-cli shutdown
- 运行时 使用 ./bin/redis-cli 进入redis命令模式
Jedis的入门
Jedis就是Redis的一个客户端,进行redis官网中查看连接方式
Jedis介绍
- Jedis是Redis官方首先的Java客户端开发包
- Jedis的GitHub地址
- 新建Java项目,引用Jar包,添加到路径中去
Jedis jedis =new Jedis("IP Address", port);
jedis.set("name", "value");
String value = jedis.get("name");
jedis.close();
在这里可能有个问题,防火墙端口可能还没有打开,这里要自行百度,根据所处的linux系统打开端口。
Jedis也可以使用连接池的方式来进行连接。
JedisPoolConfig config = new JedisPoolConfig(); //获取连接池的配置对象
config.setMaxTotal(30); //设置最大连接数
config.setMaxIdle(10); //设置最大空闲连接数
JedisPool jedisPool = new JedisPool(config, "IP Address", port); //获得连接池
Jedis jedis = jedisPool.getResource(); //得到jedis
Redis的数据类型
5种数据类型
- 字符串String
- 字符串列表list
- 字符串集合set
- 哈希hash
- 有序字符串集合sorted set
key命名的注意点
- 不要太长(不超过1024个字节)
- 不要太短
- 统一的命名规范
存储String
- 二进制安全的,存入和获取的数据相同
- Value最多可谓容纳的数据长度是512兆
常用命令
- 赋值
- set key value 返回ok
- get key 返回value
- getset value 先获取再设置这个key的值
- 取值 get key
- 删除 del key
- 数值的增减 数值进行递增
- incr key: ++1 (需要保证key的值可以转成int)
- decr key: --1 (同上)
- 扩展命令
- incrby key value 将指定的key的值加上value, 同时也要保证key的值可以转成int
- decrby key value 将指定的key的值减少value,同上
- append key value 在指定的key的值从后面追加上value
存储Hash
- String Key 和String Value的map容器
- 每一个Hash可以存储4294967295个键值对
常用命令
- 赋值
- hset hashname key value 设置一个hash 键 值,可以设置多个键值对
- hmset hashname key1 value1 key2 value2 一次为一个hash设置多个键值对
- 取值
- hget hashname key 返回key的值
- hmget hashname key1 key2 key3 一次返回多个key的值
- hgetall hashname 直接返回hash中的所有键值对
- 删除
- hdel hashname key1 key2 返回ok可以删除多个key-value
- del hashname 直接删除所有的key-value,没有这个值了
- 扩展命令
- hincrby hashname key value hashname中的key中的值会加上value
- hdecrby hashname key value hashname中的key中的值会减少value
- hexists hashname key 判断hashname中有没有这个key
- hgetall hashname 返回hashname中的所有key-value
- hlen hashname 返回hashname中的key-value的长度
- hkeys hashname 得到所有key
- kvals hashname 得到所有value
存储list
- ArrayList 使用数组方式
- LinkedList 使用双向链接方式
- 双向链表中增加数据
- 双向链表中删除数据
存储list常用命令
-
两端添加
- lpush listname value1 value2 value3 从左开始插入
- rpush listname value1 value2 value3 从右开始插入
-
查看列表
- lrange listname start(0) end(-1) 这里-1代表倒数第一个,也可用正数0 10表示从下标0到下标10
-
两端弹出
- lpop listname 从左边弹出,如果不存在返回nul,存在返回值
- rpop listname 从右边弹出,如果不存在返回nul,存在返回值
-
获取列表元素个数
- llen listname 返回listname中的长度
-
扩展命令
-
lpushx listname value 如果该list存在则插入,如果不存在就不会插入
-
rpushx listname value 如果该list存在则插入,不存在就不会插入
-
lrem listname count value 如果count大于0,则会从头开始往后删除count个value值,count等于0,则会从头开始把所有value值删除,如果count小于0,则会从尾部开始删除count个value值
-
lset listname index value 在index的下标上插入value,从0开始计算
-
linsert listname before value insert_value 在value值的前面插入insert_value值
-
linsert listname after value insert_value 在value值的后面插入insert_value
-
rpoplpush listname1 listname2 将listname1中的最右边的值弹出,并从listname2左边压入
rpoplpush使用场景
消息发布系统–》 time>12 满足条件的成功消息–》未达到条件,在原有队列中继续循环,只有达到条件后才能弹栈
-
存储Set
- 看作没有顺序的集合
- Set集合中不允许出现重复的元素
- Set可包含的最大元素数量是4294967295
-
添加和删除元素
- sadd setname value1 value2 value3 向setname中添加value1 value2 value3
- srem setname value1 value2 从sername中删除value1 value2
-
获得集合中的元素
- smembers setname 查看setname中的元素
- sismember setname value 查看setname中是否存在value
-
集合中的差集运算
- sdiff setname1 setname2 查看setname1和setname2中的差集,和set中的元素位置有关
-
集合中的交集运算
- sinter setname1 setname2 查看两个set中的交集
-
集合中的并集运算
- sunion setname1 setname2 查看两个set中的并集
-
扩展命令
- scard setname 得到set的具体数量
- srandmember setname 随机返回set中的一个value
- sdiffstore newsetname setname1 setname2 把setname1和setname2 差集存入newsetname集合中
- sinterstore newsetname setname1 setname2 把setname1 和setname2 交集存入newsetname集合中
- sunion newsetname setname1 setname2 把setname1 和setname2 并集结果存到newsetname集合中
使用场景
- 跟踪具有唯一性的数据,比如说访问博客唯一ip地址
- 用于维护数据对象之间的关联关系。购买所有电子设备客户的id,存到一个指定的set中,把购买别一个设备的客户id存到另一个set中,可以看到两个集合中的交集,从而知道同时购买两件商品的用户
存储Sorted-Set
和Set很相似,都是字符串集合,都不允许重复
不同:
- Sorted-Set和Set的区别
- Sorted-Set中的成员在集合中的位置是有序的
实际应用场景:游戏排名和微博热点排名
常用命令
- 添加元素
- zadd zsetname score value1 score value2 向zsetname中添加value1和value2
- zadd zsername newscore value1 向zsetname中添加拥有新score的value1
- 获得元素
- zscore zsetname value 得到value的分数score
- zcard zsetname 得到zsetname中的数量
- 删除元素
- zrem zsetname value1 value2 从zsetname中删除value1和value2的值
- 范围查询
- zrange zsetname 0 -1 显示所有value 从小到大
- zrange zsetname 0 -1 withscores 显示所有value并且带上所对应的score
- zrangebyscore zsetname 0 100 【withscores】
- zrevrange zsetname 0 -1 显示所有value 从大到小
- zrevrange zsetname 0 -1 withscores 显示所有value并且带上所对应的score
- zremrangebyrank zsetname 0 4 按照范围来删除value
- zremrangebyscore zsetname 80 100 按照分数范围来删除value
- 扩展命令
- zrangebyscore zsetname 0 100 【withscores】 显示所有分数在0-100范围内的值
- zrangebyscore zsetname 0 100 【withscores】 limit 0 2 只显示其中的两个
- zincrby zsetname intvalue value 给zsetname中的value值增加intvalue
- zcount zsetname 80 90 显示在80分和90分之间的个数
Sorted-Set使用场景
- 大型在线游戏积分排行榜
- 构建索引数据
Keys的通用操作
- keys * 所有key的查看
- keys my? 查看以my开头的所有key
- del key1 key2 key3 删除key1 key2 key3
- exisis key1 查看key1是否存在
- rename keyname newkeyname 重命名keyname
- expire keyname 1000 设置一个过期时间
- ttl keyname 查看所剩的时间
- type keyname 查看key的类型
- flushall 清空数据库
Redis的特性
相关特性:
- 多数据库
- 一个Redis实例,可以包含多个数据库,客户端可以指定连接某个Redis实例的数据库。
- Redis中有16个数据库,从0号开始到15,默认连接0号数据库
- 可以通过select命令来选择连接某个数据库。 select 1
- move keyname 1 将keyname从当前数据库移到1号数据库
- Redis事务
- multi exec discard 实现事务 所有命令都将会被串行化,顺序执行,执行期间Redis将不会为其他服务端提供任何的服务,从而保证事务中的命令都被原子化执行
- multi 相当于开启事务,其后的命令都会被存放到命令的队列中
- exec 相当于提交,将命令队列原子化执行
- discard 相当于callback回滚
Redis的持久化
从内存把数据存到磁盘中:持久化
Redis的两种持久化方式
- RDB方式
- 默认支持
- 在指定的时间内,将数据集快照定入磁盘:多少秒写入到磁盘一次
- 优势:整个Redis只包含一个文件,对于备份来说非常好,对于灾难恢复来说很轻松,性能最大化
- 劣势:如果在定时持久化之间宕机,那么前面的数据就没有了。通过分叉子进程来进行持久化,当数据太大时可能会发生整个服务器停止几毫秒。
- 配置:100多行左右,发现save 900 1 save 300 10 save 60 10000, dbfilename dump.rdb dir ./
- AOF方式
- 以日志的形式记录服务器处理的每一个操作,在Redis启动的时候,它会读取该文件然后重新去构建数据库来保证启动后的数据是完整的(更高的数据安全性)
- 优势:
- 更高的数据安全性 3种同步策略 1.每秒同步(异步完成,如果宕机这一秒内修改的数据将丢失) 2.每修改同步(每次修改同步效率低但是最安全) 3.不同步
- 对于日志文件的写入操作采用的是append模式, 因此在写入过程中就算出现宕机现象也不会破坏日志文件中已经存在的内容,如果本次操作只是写入了一半的数据就出现系统崩溃的问题,下一次可以通过Redis-check-aof来帮助解决数据一致性问题
- 如果日志过大,Redis可以自动启动重写机制,Redis以append的模式不断把修改的数据写到老的磁盘文件中,同时还会创建一个新的文件用来记录此期间产生了哪些修改命令被执行了,因此在进行重写切换的时候可以更好地保障数据安全性。
- AOF包含一个格式非常清晰易于理解的日志文件,用于记录所有修改操作,也可以通过这个文件来进行数据的重建。
- 劣势:
- 对于相同数据的数据集,AOF的文件要比RDB文件大一些
- 因为同步策略的不同,同步效率要低于RDB
- 配置:appendonly no 变成 appendonly yes ,会产生appendonly.aof 选择一种同步策略 appendfsync always appendfsync everysec appendfsync no
- 无持久化
通过配置禁用Redis持久化,此时可以认为Redis只是作为一个缓存工具 - 同时使用RDB和AOF方式
总结
Redis是一种主流的NoSQL数据库, 有很多应用场景可以使用.
如果你发现哪里有问题, 请评论批评指正, 非常感谢.😃