玩转Redis-初探Redis

概述

Redis:REmote DIctionary Server(远程字典服务器)
是完全开源免费的,用C语言编写的,高性能的(key-value)分布式内存数据库,基于内存运行并支持持久化的NoSQL服务器,也被人们称作数据结构服务器。

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
  • Redis不仅仅支持简单的key-value类型数据,同时还提供list,set,zset,hash等数据结构的存储
  • Redis支持数据的备份,即master-slave模式的数据备份

Redis启动后杂项基础知识

单进程

#1
Redis是以单进程模型来处理客户端的请求。对读写事件的响应是通过对epoll函数的包装来做到的。Redis的实际处理速度完全依靠主线程的执行效率。

Epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IOselect/poll的增强版本。它能显著提高程序在大量并发连接中只有少量活跃情况下的系统CPU利用率

数据库个数

#2
默认16个数据库,类似数组下标从0开始,初始默认使用零号库
Select命令切换数据库–select 数字

#3
Dbsize查看当前数据库key的数量
在这里插入图片描述
#4
FLUSHDB:清空当前库;
FLUSHALL:通杀全部库

#5
统一密码管理,16个库都是同样的密码,要么都OK要么一个也连接不上

#6
Redis的索引都是从0开始

#7
默认端口都是6379
开启Redis:
在这里插入图片描述


常用五大数据类型

  • String(字符串)
  • Hash(哈希,类似java里的Map)
  • List(列表)
  • Set(j集合)
  • Zset(sorted set:有序集合)

String(单值单value)

String是redis最基本的类型,单key单value。String类型是二进制安全的,意思是redis的String可以包含任何数据,比如jpg或者序列化后的对象。一个redis中字符串value最多可以是512M.
常用:
set key value
del key
append key new_value//改值
strlen key//获得value长度

INCR key//value为数字,自增1
INCRBY key num(要增加的数字)//value为数字

DECR key//value为数字,自减1
DECRBY key num(要减少的数字) //value为数字

getrange/setrange

getrange:获取指定范围内的值

127.0.0.1:6379> set ky "Reyco"
OK
127.0.0.1:6379> get ky
"Reyco"
127.0.0.1:6379> GETRANGE ky 0 -1  //零到负1,即获取全部
"Reyco"
127.0.0.1:6379> GETRANGE ky 0 3
"Reyc"

setrange;设置指定范围内的值,格式是setrange key 具体值

127.0.0.1:6379> SETRANGE ky 1 xxxx
(integer) 5
127.0.0.1:6379> get ky
"Rxxxx"

setex(set with expire)键秒值//创建键,并设置存活时间
setnx(set if not exist)//如果存在,则沿用之前的值

mset(merge 合并)/mget

127.0.0.1:6379> mset key1 11 key2 22 key3 33//批操作
OK
127.0.0.1:6379> mget key1 key2 key3//批操作
1) "11"
2) "22"
3) "33"

Hash(KV模式不变,但V是一个键值对)

Redis Hash是一个键值对集合,是一个String类型的field和value的映射表;Hash特别适合用来存储对象,类似Java中Map的< String , Obejct>

#hset/hget

127.0.0.1:6379> hest user id 11
127.0.0.1:6379> hget user id
"11"
127.0.0.1:6379> hset user name Reyco
(integer) 1
127.0.0.1:6379> hget user name
"Reyco"

#hmset(复合操作)/hmget

127.0.0.1:6379> hmset user address Guangzhou phone 133
OK
127.0.0.1:6379> hmget user address phone
1) "Guangzh"
2) "133"

#hlen 获取value长度
#hexists 判断某个value是否存在

#hkeys/hvals 单独获得key和value

127.0.0.1:6379> HKEYS user
1) "id"
2) "name"
3) "address"
4) "phone"
127.0.0.1:6379> HVALS user
1) "11"
2) "Reyco"
3) "Guangzhou"
4) "133"


List(单值多value)

Redis列表是简单的字符串列表,按照插入表的顺序。你可以添加一个元素置表的头部或者尾部,底层实际上是链表。
常用:
List命令中有很多L-R区分。简单理解,将一个List从上到下,将上标为LEFT ,将下标为RIGHT。想象下一个List列表逆时针选择,那么上就是LEFT,下就是RIGHT
lpush(l-left) /rpush-(r-right)/ lrange–创建List

127.0.0.1:6379> LPUSH list01 0 1 2 3 4 5
(integer) 6
0.0.1:6379> LRANGE list01 0 -1  //因为是LPUSH创建,所以从左边,也就是从上面开始弹出
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "0"

lpop/rpop–弹出List栈顶(L-R为方向的不同)

127.0.0.1:6379> LPOP list01
"5"
127.0.0.1:6379> RPOP list01
"0"

lindex 按照索引下标获得元素(从上到下)

127.0.0.1:6379> lindex list01 2
"2"

#llen–List长度

lrem Key 删N个value

127.0.0.1:6379> LPUSH list03 0 0 1 1 2  2 3  3 4 4 5 5  6 6 7 7
(integer) 16
127.0.0.1:6379> LREM list03 2 1 //删2个'1'
(integer) 2
127.0.0.1:6379> LRANGE list03 0 -1
 1) "7"
 2) "7"
 3) "6"
 4) "6"
 5) "5"
 6) "5"
 7) "4"
 8) "4"
 9) "3"
10) "3"
11) "2"
12) "2"
13) "0"
14) "0"

#ltrim key 开始index 结束index ,截取指定范围的值后再赋给key

127.0.0.1:6379> LRANGE list03 0 -1
 1) "7"
 2) "7"
 3) "6"
 4) "6"
 5) "5"
 6) "5"
 7) "4"
 8) "4"
 9) "3"
10) "3"
11) "2"
12) "2"
13) "0"
14) "0"
127.0.0.1:6379> LTRIM list03 0 4 //截取list03的索引从0到4 再赋给list03
OK
127.0.0.1:6379> LRANGE list03 0 -1
1) "7"
2) "7"
3) "6"
4) "6"
5) "5"

#rpoplpush 源列表 目的列表(移走某个值到另一个List)

127.0.0.1:6379> LRANGE list01 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> LRANGE list02 0 -1
1) "7"
2) "6"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
8) "0"
127.0.0.1:6379> RPOPLPUSH list01 list02 //将list01右边的值pop,push进list02的左边
"1"
127.0.0.1:6379> LRANGE list02 0 -1
1) "1" //目标值
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
9) "0"

#lset key index value//对List下标的某个值赋值

#linsert key before/after 值 1 值2//在值1 前/后 插入值2

List性能总结

List是字符串链表,left,right都可以插入添加。如果键不在,创建新的链表;如果键已存在,新增内容;如果值全移除,对应的键也消失了。链表的操作无论是头和尾效率都很高,但假如是对中间元素进行操作,效率就很惨淡了。


Set(单值多value,不允许重复)

Redis的Set是String类型的无序集合,是通过HashTable实现的。

#sadd-创建
#smembers-查看set
#sismember-查看set中是否存在某个元素

127.0.0.1:6379> sadd set01 1 1 2  2 3 3
.0.0.1:6379> SMEMBERS set01 。。没有重复的元素
1) "1" 
2) "2"
3) "3"

#scard-获取集合里面的元素个数
#srem key value 删除集合中的元素
#seandmember key 某个整数(随机出某个数)

#数学集合类
差集:sdiff key1 key2
交集 :sinter key1 key2
并集:sunion key1 key2

127.0.0.1:6379> SMEMBERS set01 
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SRANDMEMBER set01 2 //从set01中随机出两个值
1) "2"
2) "3"

#spop key(随机出栈)
#smove key1 key2 value(在key1里的某个值)–作用:将key1里的某个值赋给key2


Zset(有序集合)

Redis的zset和set都是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,Redis是通过分数来为集合中的成员进行从小到大的排序。Zset的成员是唯一的,但分数(score)是可以重复的
之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2

#zadd/zrange

127.0.0.1:6379> zadd zset01 60 v1 70 v2 80 v3
(integer) 3
127.0.0.1:6379> ZRANGE zset01 0 -1
1) "v1"
2) "v2"
3) "v3"

#zrangebyscore key 开始score 结束score //按照score排序
#’ (’-是不包含的意思 两个(可以作为范围

127.0.0.1:6379> ZRANGEBYSCORE zset01 60  (80 //从60开始排序,不包含80
1) "v1"
2) "v2"

127.0.0.1:6379> ZRANGEBYSCORE zset01 (60  (80 //60-80之间,且不包含60和80
1) "v2"

#zrem key 某score下对应的value值 //作用是删除元素

#zcard key //返回key下value个数(score和value为一体)

#zrevrank key valus值 //作用是逆序获得下标值


Redis_Key关键字

常用:
Keys *–列举key
exists key的名字,判断某个key是否存在
move key db(库的名称)–当前库就没有了,被移除了
expire key 秒钟–为给定的key设置过期时间
ttl key–查看还要多少秒过期,-1表示永不过期 -2表示已过期
type key 查看你的key是什么类型的

猜你喜欢

转载自blog.csdn.net/weixin_40288381/article/details/88077620