Redis基础知识
redis默认有16个数据库,并且这个数量可以在conf配置文件中更改
默认使用的是第0个
可以使用 select 进行切换数据库!
key *查看数据库所有的key
清除当前数据库 flushdb
清除全部数据库的内容FLUSHALL
为什么redis是6379!(了解一下即可!)
Redis 是单线程的
明白Redis是很快的,官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了!Redis 是C语言写的,官方提供的数据为 100000+的QPS,完全不比同样是使用 key-vale的Memecache差!
Redis 为什么单线程还这么快?
1、误区1:高性能的服务器一定是多线程的 ?
2、误区2:多线程(CPU上下文会切换!)一定比单线程效率高!
先去CPU>内存>硬盘的速度要有所了解!
核心:redis 是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!!!),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存情况下,这个就是最佳的方案!
Redis-Key
Redis五大数据类型
String(字符串)
90% 的java程序员使用redis 只会使用一个String类型!
String类似的使用场景:value除了是我们的字符串还可以是我们的数字!
计数器、统计多单位的数量、粉丝数、对象缓存存储
List(列表)
基本的数据类型,列表
在redis里面,我们可以把list玩成,栈、队列、阻塞队列!
Redis不区分大小命令
他实际上是一个链表,before Node after ,left,right 都可以插入值
e如果key 不存在,创建新的链表
如果key存在,新增内容e
如果移除了所有值,空链表,也代表不存在
。在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)
Set(集合)
set中的值是不能重读的!
Hash(哈希)
Map集合,key-map!时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的 key-vlaue!
set myhash field kuangshen
hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息!hash 更适合于对象的存储,String更加适合字符串存储!
Zset(有序集合)
在set的基础上,增加了一个值,set k1 v1; zset k1 score1 v1
三种特殊数据类型
geospatial 地理位置
朋友的定位,附近的人,打车距离计算?
Redis 的 Geo 在Redis3.2版本就推出了!这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!可以查询一些测试数据:http://www.jsons.cn/Ingcodeinfo/0706D99C19A781A3/
只有 六个命令 官方文档:https://www.redis.net.cn/order/3685.html
Hyperloglog
什么是基数?
A {1,3,5,7,8,7}
B{1 ,3,5,7,8}
基数(不重复的元素)=5,可以接受误差!
Redis 2.8.9 版本就更新了 Hyperloglog数据结构!
Redis Hyperloglog 基数统计的算法!
优点:占用的内存是固定,2^64不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的话 Hyperloglog首选!网页的 UV(一个人访问一个网站多次,但是还是算作一个人!)
传统的方式,set 保存用户的id,然后就可以统计 set中的元素数量作为标准判断!这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;0.81%错误率!统计UV任务,可以忽略不计的!
Bitmaps
位存储
统计用户信息,活跃,不活跃! 登录、未登录!打卡,365打卡!两个状态的,都可以使用
Bitmaps 位图,数据结构!都是操作二进制位来进行记录,就只有0和1两个状态!365天=365 bit 1字节=8bit 46个字节左右!
事务
Redis 事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程的中,会按照顺序执行!
一次性、顺序性、排他性!执行一些列的命令!
------队列set set set 执行------
Redis事务没有没有隔离级别的概念!
所有的命令在事务中,并没有直接被执行!只有发起执行命令的时候才会执行!Exec
Redis单条命令是保存原子性的,但是事务不保证原子性!
redis的事务:
开启事务(multi)
命令入队(。。。)
执行事务(exec)