1.基本命令
#我的redis是放在容器里面的,所以要先进入容器
#进入redis的docker容器
docker exec -it redis bash
#启动redis
redis-cli -p 6379
#更换redis数据库(redis有16个数据库[0-15])
select 2
#查询redis所有key
keys *
#清空当前数据库
flushdb
#清空全部数据库
fiushall
#新增加一个键值对(键:name,值:lihua)
set name lihua
#通过键查看值
get name
#查看这个键是否存在(存在输出1,不存在输出0)
exists name
#将当前数据库的键值对移动到其他数据库
move name 2 #将当前键值对移动到2号数据库
#设置键值对过期时间(单位秒)
expire name 10
#查看键值对剩余存在时间(-2表示当前键值对不存在)
ttl name
#查看当前数据是什么类型
type name
2.redis是单线程的
Redis是很快的,官方表示, Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!所有就使用了单线程了!
Redis为什么单线程还这么快?
1、误区1∶高性能的服务器一定是多线程的?
2、误区2︰多线程(CPU上下文会切换!)一定比单线程效率高!
CPU>内存>硬盘的速度
redis是将所有的数据全部放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换︰增加耗时 ),对于内存系统来说,如果没有上下文切换效率就是最高的!多次读写都是在一个CPU上的,在内存一样的情况下,单线程就是最佳的方案!
3.redis五大基本数据类型
String(字符串)
这里直接贴狂神老师的笔记截图
操作String字符串
增加浏览量使用的方法,自增自减
String.substring() 截取改变字符串
setex 创建并设置过期时间
setnx 当前key不存在才会创建
批量get和set (mset mget)
getset先获取再设置,一般用于更新操作
List列表
小结
- list实际上是一个链表,before Node after , left, right 都可以插入值
- 如果key不存在,则创建新的链表
- 如果key存在,新增内容
- 如果移除了所有值,空链表,也代表不存在
- 在两边插入或者改动值,效率最高!修改中间元素,效率相对较低
- list的命令一般是l开头
lpush将值插入到列表头部
rpush将值插入到列表头部
lrange查询列表中的值
lpop 移除头部元素
rpop 移除尾部元素
127.0.0.1:6379[1]> lpush list 1 #向list列表头部添加一个数字
(integer) 1
127.0.0.1:6379[1]> lpush list 2
(integer) 2
127.0.0.1:6379[1]> lpush list 3
(integer) 3
127.0.0.1:6379[1]> lrange list 0 -1 #输出整个list列表
1) "3"
2) "2"
3) "1"
127.0.0.1:6379[1]> lrange list 0 1
1) "3"
2) "2"
127.0.0.1:6379[1]> rpush list 4 #向list列表尾部添加一个数字
(integer) 4
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "2"
3) "1"
4) "4"
###############################################
127.0.0.1:6379[1]> lpop list #移除头部(第一个)元素
"3"
127.0.0.1:6379[1]> rpop list #移除尾部(最后一个)元素
"4"
127.0.0.1:6379[1]> lrange list 0 -1
1) "2"
2) "1"
127.0.0.1:6379[1]>
ltrim 修剪;list 截断!
127.0.0.1:6379[1]> lrange list 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379[1]> ltrim list 1 2 #截取list中下标为1 2的长度,list已经被改变
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "2"
127.0.0.1:6379[1]>
Llen返回列表长度
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "2"
127.0.0.1:6379[1]> llen list
(integer) 2
127.0.0.1:6379[1]>
lrem移除指定的值(Java中的trmi方法)
127.0.0.1:6379[1]> lrange list 0 -1
1) "4"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379[1]> lrem list 1 2 #移除list集合中指定个数的value,精确匹配(移除一个2)
(integer) 1
127.0.0.1:6379[1]> lrange list 0 -1
1) "4"
2) "4"
3) "3"
4) "1"
127.0.0.1:6379[1]> lrem list 2 4 # 移除两个4
(integer) 2
127.0.0.1:6379[1]> lrange list 0 -1
1) "3"
2) "1"
127.0.0.1:6379[1]>
rpoplpush移除列表中最后一个元素,并将它移动到新的一个列表中
127.0.0.1:6379[1]> lrange list 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379[1]> rpoplpush list copylist #移除列表中最后一个元素,并将它移动到新的一个列表中
"1"
127.0.0.1:6379[1]> lrange list 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379[1]> lrange copylist 0 -1
1) "1"
127.0.0.1:6379[1]>
lset替换列表中指定下标的值(更新操作)
127.0.0.1:6379[1]> lrange list 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379[1]> lset list 0 9 #替换列表中指定下标的值
OK
127.0.0.1:6379[1]> lrange list 0 -1
1) "9"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379[1]> lset list 7 9 #替换的位置不存在,或者列表不存在就会报错
(error) ERR index out of range
127.0.0.1:6379[1]>
linsert将值插入到列表中某个位置的前面或者后面
127.0.0.1:6379[1]> lrange list 0 -1
1) "9"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379[1]> linsert list before 9 99 #插入到列表中某个位置的前面
(integer) 5
127.0.0.1:6379[1]> lrange list 0 -1
1) "99"
2) "9"
3) "4"
4) "3"
5) "2"
127.0.0.1:6379[1]> linsert list after 9 09 #插入到列表中某个位置的后面
(integer) 6
127.0.0.1:6379[1]> lrange list 0 -1
1) "99"
2) "9"
3) "09"
4) "4"
5) "3"
6) "2"
set(集合)
小结
- set中的值不能重复
- set的命令一般是s开头
- set是无序不重复集合(可以用做抽奖)
sadd新建一个set并且向其尾部添加元素
SMEMBERS 查看整个set集合
SISMEMBER 检查某个元素是否在集合中
127.0.0.1:6379[1]> sadd set 2 4 6 #新建一个set并且向其尾部添加元素
(integer) 3
127.0.0.1:6379[1]> SMEMBERS set #查看整个set集合
1) "2"
2) "4"
3) "6"
127.0.0.1:6379[1]> SISMEMBER set 2 # 检查某个元素是否在集合中,在返回1,不在返回0
(integer) 1
127.0.0.1:6379[1]> SISMEMBER set 1
(integer) 0
scard获取set集合中的内容元素个数
srem移除集合中指定的元素
**spop随机移除一个元素
127.0.0.1:6379[1]> SMEMBERS set
1) "2"
2) "4"
3) "6"
127.0.0.1:6379[1]> scard set #获取set集合中的内容元素个数
(integer) 3
127.0.0.1:6379[1]> srem set 2 #移除集合中指定的元素
(integer) 1
127.0.0.1:6379[1]> SMEMBERS set
1) "4"
2) "6"
127.0.0.1:6379[1]> SMEMBERS set
1) "0"
2) "4"
3) "6"
127.0.0.1:6379[1]> spop set #随机移除一个元素
"6"
127.0.0.1:6379[1]> SMEMBERS set
1) "0"
2) "4"
127.0.0.1:6379[1]>
随机抽出一个元素
#set是无序不重复集合(可以用做抽奖)
127.0.0.1:6379[1]> SMEMBERS set
1) "0"
2) "4"
3) "6"
127.0.0.1:6379[1]> SRANDMEMBER set #随机抽出集合中的一个元素
"4"
127.0.0.1:6379[1]> SRANDMEMBER set
"0"
127.0.0.1:6379[1]> SRANDMEMBER set
"6"
127.0.0.1:6379[1]> SRANDMEMBER set
"0"
127.0.0.1:6379[1]> SRANDMEMBER set 2 #随机抽出集合中指定个数个元素
1) "6"
2) "0"
移动一个指定的值到另外一个set集合中
127.0.0.1:6379[1]> SMEMBERS set
1) "0"
2) "4"
127.0.0.1:6379[1]> smove set copyset 0 #移动一个指定的值到另外一个set集合中
(integer) 1
127.0.0.1:6379[1]> SMEMBERS set
1) "4"
127.0.0.1:6379[1]> SMEMBERS copyset
1) "0"
数学集合: SUNION交集,SINTER并集,SDIFF差集 --用来查找共同关注
六度分割理论
127.0.0.1:6379[1]> SMEMBERS set1
1) "3"
2) "4"
3) "5"
4) "6"
127.0.0.1:6379[1]> SMEMBERS set2
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[1]> SDIFF set1 set2 #差集
1) "5"
2) "6"
127.0.0.1:6379[1]> SINTER set1 set2 #交集 共同好友就可以这样实现
1) "3"
2) "4"
127.0.0.1:6379[1]> SUNION set1 set2 #并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
Hash(哈希)
小结
- 相当于一个map集合,数据结构key-map集合 == key-<key-value>;
它实际上和String没有太大的区别,只是value是一个map集合! - 所有的Hash命令是以h开头的
- hash更适合对象的存储,String更适合字符串的存储
127.0.0.1:6379[1]> hset hash set a #set一个具体的值key-value
(integer) 1
127.0.0.1:6379[1]> hget hash set #获取一个字段的值
"a"
127.0.0.1:6379[1]> hmset hash set1 b set2 c #set多个值key-value
OK
127.0.0.1:6379[1]> hmget hash set1 set2 ##获取多个字段的值
1) "b"
2) "c"
127.0.0.1:6379[1]> hgetall hash #获取当前hash中所有字段的值,以键值对的形式输出
1) "set"
2) "a"
3) "set1"
4) "b"
5) "set2"
6) "c"
127.0.0.1:6379[1]> hdel hash set #删除指定的字段的值,删除key后对应的value就没有了
(integer) 1
127.0.0.1:6379[1]> hgetall hash
1) "set1"
2) "b"
3) "set2"
4) "c"
hlen获取哈希表的字段数量
HEXISTS判断哈希中某个字段是否存在
127.0.0.1:6379[1]> hgetall hash
1) "set1"
2) "b"
3) "set2"
4) "c"
127.0.0.1:6379[1]> hlen hash #获取字段数量
(integer) 2
127.0.0.1:6379[1]> HEXISTS hash set1 #判断哈希中某个字段是否存在,存在返回1,不存在返回0
(integer) 1
127.0.0.1:6379[1]> HEXISTS hash set
(integer) 0
hkeys 获取所有的field(字段)
hvals 获取所有的value(值)
127.0.0.1:6379[1]> hgetall hash
1) "set1"
2) "b"
3) "set2"
4) "c"
127.0.0.1:6379[1]> hkeys hash # 获取所有的field(字段)
1) "set1"
2) "set2"
127.0.0.1:6379[1]> hvals hash #获取所有的value(值)
1) "b"
2) "c"
HINCRBY 指定增量进行增加
127.0.0.1:6379[1]> hset hash set3 4 #将当前值设置为4
(integer) 1
127.0.0.1:6379[1]> HINCRBY hash set3 1 #在4的基础上增加1
(integer) 5
127.0.0.1:6379[1]> hget hash set3
"5"
Zset有序集合
小结
- 在set的基础上怎加了一个值,set:
set key value
zset:zset key score value
- zset可以应用在排行榜上面
127.0.0.1:6379[1]> zadd zset 1 a #添加一个值
(integer) 1
127.0.0.1:6379[1]> zadd zset 2 b 3 c #添加多个值
(integer) 2
127.0.0.1:6379[1]> zrange zset 0 -1 #查看所有值
1) "a"
2) "b"
3) "c"
zrangebyscore升序排序(zrange
是输出整个集合的命令 by
是通过 score
是分数)
ZREVRANGE降序排序
127.0.0.1:6379[1]> zadd wages 2000 zhang
(integer) 1
127.0.0.1:6379[1]> zadd wages 3922 lihua
(integer) 1
127.0.0.1:6379[1]> zadd wages 10000 baihui
(integer) 1
127.0.0.1:6379[1]> zadd wages 1000 dapao
(integer) 1
#以上是添加数据
127.0.0.1:6379[1]> zrangebyscore wages -inf +inf #查询数据并且通过score升序排列 排列规则是从小到大( -inf负无穷 +inf正无穷 )
1) "dapao"
2) "zhang"
3) "lihua"
4) "baihui"
127.0.0.1:6379[1]> ZREVRANGE wages 0 -1 #查询数据 降序排序
1) "taohui"
2) "dapao"
3) "zhang"
127.0.0.1:6379[1]> ZREVRANGE wages 0 -1 withscores
1) "taohui"
2) "30000"
3) "dapao"
4) "10000"
5) "zhang"
6) "2000"
###############升序排列按照键值对的形式 输出
127.0.0.1:6379[1]> zrangebyscore wages -inf +inf withscores
1) "dapao"
2) "1000"
3) "zhang"
4) "2000"
5) "lihua"
6) "3922"
7) "baihui"
8) "10000"
zrem移除zset中的元素
ZCARD获取指定集合中的个数
127.0.0.1:6379[1]> zrange wages 0 -1
1) "lihua"
2) "zhang"
3) "dapao"
4) "taohui"
127.0.0.1:6379[1]> zrem wages lihua #移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379[1]> zrange wages 0 -1
1) "zhang"
2) "dapao"
3) "taohui"
127.0.0.1:6379[1]> ZCARD wages
(integer) 3
zcount获取指定区间的成员数量
127.0.0.1:6379[1]> zrange wages 0 -1 withscores
1) "zhang"
2) "2000"
3) "dapao"
4) "10000"
5) "taohui"
6) "30000"
127.0.0.1:6379[1]> zcount wages 10000 50000 #获取指定区间的成员数量
(integer) 2
网友评论