Redis的基本知识
- Redis是单线程
- Redis为什么单线程也这么快?
- 五大数据类型
- Redis-Key
- String类型
- List类型
- Set集合
- Hash
- Zset(有序集合)
redis默认有16个数据库
默认使用的是第0个
不同的数据库可以存放不同的值
清除当前数据库
清空全部
Redis是单线程
Redis是基于内存操作,CPU不是Redis性能瓶颈Redis的平静是根据机器的内存和网络带宽,既然可以使用单线程就没必要使用多线程
Redis是C语言写的,每秒是100000+的QPS的,不比key-vale的Memecache差
Redis为什么单线程也这么快?
误区1:高性能的服务器一定是多线程?
误区2:多线程(CPU上下文需要切换)一定比单线程高
CPU、内存、硬盘的速度
核心:Redis是将所有的数据全部放在内存中所以使用单线程操作效率就是最高的,多线程(CPU上下文会切换:耗时操作),对于内存系统来说,如果没有上下文切换效率就是最高,多次读写都是在一个CPU上,在内存情况下这个就是最佳方案
五大数据类型
Redis-Key
127.0.0.1:6379> keys * #查看所有的key
(empty list or set)
127.0.0.1:6379> set name hhh #创建一个key name value是hhh
OK
127.0.0.1:6379> set age 23
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> exists name #判断key是不是存在
(integer) 1
127.0.0.1:6379> move name 2 #将key name移到第二个数据库中
127.0.0.1:6379> expire name 5 #设置key为name的过期时间为5秒
(integer) 1
127.0.0.1:6379> ttl name #查看倒计时时间
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> type name #返回key的类型
String类型
127.0.0.1:6379> set key1 vv #设置值
OK
127.0.0.1:6379> get key1 #获得key值
"vv"
127.0.0.1:6379> exists key1 # key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello" # 如果本来没有key1 就相当于创建一个key
(integer) 7
127.0.0.1:6379> get key1
"vvhello"
127.0.0.1:6379> strlen key1 #得到key1 的值的长度
(integer) 7
127.0.0.1:6379>
##################################################
127.0.0.1:6379> set view 0
OK
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> INCR view #自增1
(integer) 1
127.0.0.1:6379> INCR view
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> get view
"2"
127.0.0.1:6379> decr view #自减1
(integer) 1
127.0.0.1:6379> decr view
(integer) 0
127.0.0.1:6379> get view
"0"
127.0.0.1:6379>
####################################
127.0.0.1:6379> incrby view 20 #直接加20
(integer) 20
127.0.0.1:6379> get view
"20"
127.0.0.1:6379> decrby view 5 #减5
(integer) 15
127.0.0.1:6379> get view
"15"
127.0.0.1:6379>
######################################
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set key 123456
OK
127.0.0.1:6379> get key
"123456"
127.0.0.1:6379> getrange key 1 3 #获取下标1到3
"234"
127.0.0.1:6379> getrange key 0 -1 #获取全部的
"123456"
127.0.0.1:6379>
127.0.0.1:6379> get key
"123456"
127.0.0.1:6379> setrange key 2 asd #从下标2开始替换为asd
(integer) 6
127.0.0.1:6379> get key
"12asd6"
127.0.0.1:6379>
mseten是一个与操作
List类型
List在redis中可以为栈、队列、阻塞队列
所有的list命令是以l开头
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> lpush list one # 将一个或者多个值插入到列表头部(左边)头插
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 2
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1
1) "three"
2) "two"
127.0.0.1:6379> lrange list 0 -1 # 先拿出来的是最后放进去的
1) "three"
2) "two"
3) "one"
127.0.0.1:6379>
127.0.0.1:6379> rpush list hhh #从右边加进去 尾插
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "hhh"
127.0.0.1:6379>
lpop #头删
rpop #尾删
实际上是一个链表,before Node after , left , right都可以插入值如果key不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
LIST底层是快速链表,快速链表相对于普通链表使用的是连续地址空间块,当数据过多时候,通过指针连接地址空间块
Set集合
127.0.0.1:6379> sadd myset lll #添加
(integer) 1
127.0.0.1:6379> sadd myset dasd
(integer) 1
127.0.0.1:6379> sadd myset ddwqd
(integer) 1
127.0.0.1:6379> smembers myset #打印所有
1) "dasd"
2) "ddwqd"
3) "lll"
127.0.0.1:6379> sismember myset lll #判断是否存在
(integer) 1
127.0.0.1:6379> sismember myset 222
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> scard myset#获取set中元素个数
(integer) 3
127.0.0.1:6379> smembers myset
1) "dasd"
2) "ddwqd"
3) "lll"
127.0.0.1:6379>
Hash
Map集合,key-mapl时候这个值是一个map集合!本质和String类型没有太大区别,还是一个简单的 key-vlaue !
Zset(有序集合)
在set的基础上,增加了一个值,set k1 v1 zset k1 score1 v1