iis怎么做网站空间,潍坊搜索引擎优化,c2c网站开发成本,静态网站末班一.概述
Redis是什么#xff1f; Redis是远程服务字典服务#xff0c;是一个开源的使用ANSI C语言编写#xff0c;支持网络#xff0c;可基于内存亦可持久化的日志型#xff0c;Key-Value数据库#xff0c;并提供多种语言的API。 redis会周期性把更新的数据写入磁盘或把…一.概述
Redis是什么 Redis是远程服务字典服务是一个开源的使用ANSI C语言编写支持网络可基于内存亦可持久化的日志型Key-Value数据库并提供多种语言的API。 redis会周期性把更新的数据写入磁盘或把修改操作写入追加的记录文件并且在此基础上实现了master-slave主从同步。免费开源是NoSQL技术之一也称为结构化数据库。 Redis能干嘛
内存存储持久化内存中是断电即失所以说持久化很重要效率高可用于高速缓存发布订阅系统地图信息分析计时器计数器 …
二.Redis的基本了解
官方文档 英文官方文档https://redis.io/ 中文文档http://www.redis.cn/ Redis-Key常用命令 http://www.redis.cn/commands.html
127.0.0.1:6379 ping #查看当前连接是否正常正常返回PONG
PONG
127.0.0.1:6379 clear #清楚当前控制台为了更好的看到下面输入的命令
127.0.0.1:6379 keys * #查看当前库里所有的key
1) db
127.0.0.1:6379 FLUSHALL #清空所有库的内容
OK
127.0.0.1:6379 set name dingdada #添加一个key为‘name’ value为‘dingdada’的数据
OK
127.0.0.1:6379 get name #查询key为‘name’的value值
dingdada
127.0.0.1:6379 EXISTS name #判断当前key是否存在
127.0.0.1:6379 move name 1 #移除当前库1的key为‘name‘的数据三.五大数据类型
1. Redis通用命令 2. Redis数据类型
2.1 String - 字符串类型 字符串命令
String表面上是字符串但其实他可以灵活的表示字符串整数浮点数3种值。Redis自动识别这3种值
127.0.0.1:6379 set key1 hello world! #注意点插入的数据中如果有空格的数据请用“”双引号否则会报错
OK
127.0.0.1:6379 set key1 hello world! #报错因为在Redis中空格就是分隔符相当于该参数已结束
(error) ERR syntax error
127.0.0.1:6379 set key1 hello,world! #逗号是可以的
OK
127.0.0.1:6379 incr num #指定key为‘num’的数据自增1返回结果 相当于java中 i
(integer) 1
127.0.0.1:6379 get num #一般用来做文章浏览量、点赞数、收藏数等功能
1
127.0.0.1:6379 decr num #可以一直减为负数~
(integer) -1
127.0.0.1:6379 decr num #一般用来做文章取消点赞、取消收藏等功能
#截取
127.0.0.1:6379 GETRANGE key1 0 4 #截取字符串相当于java中的subString下标从0开始不会改变原有数据
hello
127.0.0.1:6379 get key1
hello world!
127.0.0.1:6379 GETRANGE key1 0 -1 #0至-1相当于 get key1效果一致获取整条数据
#替换
hello world!
127.0.0.1:6379 SETRANGE key2 5 888 #此语句跟java中replace有点类似下标也是从0开始但是有区别java中是指定替换字符Redis中是从指定位置开始替换替换的数据根据你所需替换的长度一致返回值是替换后的长度
(integer) 14
127.0.0.1:6379 get key2
hello888world!
127.0.0.1:6379 SETRANGE key2 5 67 #该处只替换了两位
(integer) 14
127.0.0.1:6379 get key2
hello678world!
#设置过期时间跟Expire的区别是前者设置已存在的key的过期时间而setex是在创建的时候设置过期时间
127.0.0.1:6379 setex name1 15 dingdada #新建一个key为‘name1’值为‘dingdada’过期时间为15秒的字符串数据
OK
127.0.0.1:6379 ttl name1 #查看key为‘name1’的key的过期时间
(integer) 6
#不存在设置
127.0.0.1:6379 setnx name2 dingdada2 #如果key为‘name2’不存在新增数据返回值1证明成功
(integer) 1
127.0.0.1:6379 get name2
dingdada2
127.0.0.1:6379 keys *
1) name2
127.0.0.1:6379 setnx name2 dingdada3 #如果key为‘name2’的已存在设置失败返回值0也就是说这个跟set的区别是set会替换原有的值而setnx不会存在即不设置确保了数据误操作~
(integer) 0
127.0.0.1:6379 get name2
dingdada22.2 Hash - Hash键值类型
Hash类型用于存储结构化数据
键-键-值 Hash 命令
2.3 List - 列表类型 List列表就是一系列字符串的“数组”按插入顺序排序 List列表最大长度为2的32次方-1可以包含40亿个元素 List 命令
小结 实际上是一个链表before Node after leftright 都可以插入值 如果key 不存在创建新的链表 如果key存在新增内容 如果移除了所有值空链表也代表不存在 在两边插入或者改动值效率最高 中间元素相对来说效率会低一点 消息排队消息队列 Lpush Rpop 栈 Lpush Lpop
2.4 Set - 集合类型
Set集合是字符串的无序集合集合成员是唯一的
2.5 Zset - 有序集合类型
Zset集合是字符串的有序集合集合成员是唯一的 它的实质是每个数据对应了分数
总结成绩表排序工资表排序年龄排序需求可以用zset来实现
四.三大特殊数据类型的学习和理解
1.Geospati地理位置
城市维度查询https://jingweidu.bmcx.com/ 注意 两极无法直接添加我们一般会下载城市数据直接通过java程序一次性导入 有效的经度从-180度到180度。 有效的纬度从-85.05112878度到85.05112878度。 m 为米。km 为千米。mi 为英里。ft 为英尺。
实际需求中我们可以用来查询附近的人计算两人之间的距离等。当然那些所需的维度我们肯定要结合java代码来一次导入手动查询和录入太过浪费时间。
2.Hyperloglog基数
什么是基数 数学层面上指两个数集中不重复的元素 但在redis中可能会有一定误差官方给的误差率为0.81% Hyperloglog优点占用的内存是固定的2^64个元素相等于只需要12kb的内存即可。效率高。
实际需求中运行一定的误差值我们可以使用技术统计来计算效率非常高如网站访问量就可以利用Hyperloglog来进行计算统计
3.Bitmap位存储
Bitmap位图数据结构都是操作二进制位来进行记录只有0和1状态
实际需求中可能需要我们统计用户的登录信息员工的打开信息等。只要是事物的只有两种状态我们都可以使用Bitmap来进行操作。
五.Redis中的事物和乐观锁如何实现
1. 前言
事务的ACIDMySQL事务 在Redis中没有隔离级别的概念 在Redis单条命令式保证原子性但是事物不保证原子性 乐观锁 ①当程序中可能出现并发的情况时就需要保证在并发情况下数据的准确性以此确保当前用户和其他用户一起操作时所得到的结果和他单独操作时的结果是一样的。 ②没有做好并发控制就可能导致脏读、幻读和不可重复读等问题。 在Redis是可以实现乐观锁的
2. Redis如何实现事务
正常执行事务
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379 set age 26 #添加数据
QUEUED
127.0.0.1:6379 set high 172 #添加数据
QUEUED
127.0.0.1:6379 exec 执行事务
1) OK
2) OK
3) OK
127.0.0.1:6379 get name #获取数据成功证明事务执行成功
dingyongjun
127.0.0.1:6379 get age
26放弃事务
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379 set age 26 #添加数据
QUEUED
127.0.0.1:6379 discard #放弃事务
OK
127.0.0.1:6379 get name #不会执行事务里面的添加操作
(nil)③编译时异常代码有问题或者命令有问题所有的命令都不会被执行
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379 set age 23 #添加数据
QUEUED
127.0.0.1:6379 getset name #输入一个错误的命令这时候已经报错了但是这个还是进入了事务的队列当中
(error) ERR wrong number of arguments for getset command
127.0.0.1:6379 set high 173 #添加数据
QUEUED
127.0.0.1:6379 exec #执行事务报错并且所有的命令都不会执行
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379 get name #获取数据为空证明没有执行
(nil)运行时异常除了语法错误不会被执行且抛出异常后其他的正确命令可以正常执行
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 set name dingyongjun #添加字符串数据
QUEUED
127.0.0.1:6379 incr name #对字符串数据进行自增操作
QUEUED
127.0.0.1:6379 set age 23 #添加数据
QUEUED
127.0.0.1:6379 get age #获取数据
QUEUED
127.0.0.1:6379 exec #执行事务。虽然对字符串数据进行自增操作报错了但是其他的命令还是可以正常执行的
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) 23
127.0.0.1:6379 get age #获取数据成功
23总结由以上可以得出结论redis是支持单条命令事务的但是事务并不能保证原子性
3. Redis如何实现乐观锁
watch‘监听’
127.0.0.1:6379 set money 100 #添加金钱100
OK
127.0.0.1:6379 set cost 0 #添加花费0
OK
127.0.0.1:6379 watch money #监控金钱
OK
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 DECRBY money 30 #金钱-30
QUEUED
127.0.0.1:6379 incrby cost 30 #花费30
QUEUED
127.0.0.1:6379 exec #执行事务成功这时候数据没有发生变动才可以成功
1) (integer) 70
2) (integer) 30多线程测试watch 线程一
#线程1
127.0.0.1:6379 set money 100 #添加金钱100
OK
127.0.0.1:6379 set cost 0 #添加花费0
OK
127.0.0.1:6379 watch money #开启监视乐观锁
OK
127.0.0.1:6379 multi #开启事务
OK
127.0.0.1:6379 DECRBY money 20 #金钱-20
QUEUED
127.0.0.1:6379 INCRBY cost 20 #花费20
QUEUED
#这里先不要执行先执行线程2来修改被监视的值
127.0.0.1:6379 exec #执行报错因为我们监视了money这个值如果事务要对这个值进行操作前
#监视器会判断这个值是否正常如果发生改变事务执行失败
(nil)线程二
#线程2这个在事务执行前操作执行
127.0.0.1:6379 INCRBY money 20 #金钱20
(integer) 120总结 悲观锁 什么时候都会出问题所以一直监视着没有执行当前步骤完成前不让任何线程执行十分浪费性能一般不使用 乐观锁 只有更新数据的时候去判断一下在此期间是否有人修改过被监视的这个数据没有的话正常执行事务反之执行失败
六.Redis线程相关知识
Redis 是单线程的这意味着它在任何给定时刻只会执行一个操作。虽然 Redis 是单线程的但它通过使用非阻塞 I/O 和基于事件驱动的设计来实现高性能和并发处理。 Redis 的单线程架构使其非常快速因为它无需处理线程之间的竞争条件和锁定。相反Redis 依靠高效的内存数据存储和快速的非阻塞 I/O 操作来提供高吞吐量和低延迟。此外Redis 还使用了一些技术来确保数据的一致性和持久性如写日志和定期的数据快照。 虽然 Redis 主进程是单线程的但它可以在后台启动多个附加线程来执行不同的任务如数据持久化和复制。这些附加线程不会影响主线程的性能因为它们通常处于低优先级状态并且它们的工作不会阻塞主线程的执行。这使得 Redis 能够在单个线程下实现高性能和并发处理成为一个非常受欢迎的内存数据库和缓存服务器。