开始
Redis高性能key-value 同时支持数据库list,set,zset,hash存储等数据结构
第一次尝试:
(先用windows 版本看下入门,一般linux多用,学来源菜鸟教程)
下载安装到一个你能找到的地方
建议在某个盘下建立一个tool文件夹,把go啦java啦mysql啦Redis拉,把这个工具工具放进去
https://github.com/tporadowski/redis/releases
下载zip版本
(前提是每个命令提示符都必须先进入redis如果在那份文件下找不到,切换路径的命令:cd /d 路径)
-
在cmd(命令提示符中)打开服务器命令: redis-server.exe redis.windows.conf
-
再次打开命令提示符,打开客服端:redis-cli.exe -h 127.0.0.1 -p 6379
-
设置键值对:set heiKey ha
-
取键值对:get heiKey
数据类型
- string
- hash
- list
- set
- zset (有序集合)
简介
偷一张网络视频图
他是一种nosql数据库,
好处如图
减少作为缓存io压力
NoSQL非关系数据库
- Memcache
- Redis
- mongoDB
- Neo4j
- Apache Cassandra
典型的应用场景 | 数据模型 | 优点 | 缺点 | ||
---|---|---|---|---|---|
Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存主要用于处理大量数据的高访问负载,以及一些日志系统等。 | Key 指向 Value 键值对,通常使用hash table来实现 | 查找速度快 | 数据没有结构化,通常只作为字符串或二进制数据使用 | |
Cassandra, HBase, Riak | 分布式的文件系统 | 同一列数据存储在一起 | 搜索速度快,可扩展性强,分布式扩展更容易 | 功能相对有限 | |
CouchDB, MongoDb | Web应用(与Key-Value类似,Value它是结构化的。区别在于数据库可以理解Value的内容) | Key-Value对应键值对,Value结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能低,缺乏统一的查询语法。 | |
Neo4J, InfoGrid, Infinite Graph | 社交网络、推荐系统等。专注于建立关系图谱 | 图结构 | 采用图结构相关算法。例如,最短路径寻址,N搜索度关系等 | 很多时候,需要计算整个图纸来获取所需的信息,而且这种结构不容易做分布式集群方案。 |
linux版本学习
注意事项
xftp连接云服务器的实例主机密码是root账户密码:W…….
下载安装
下载安装redis
安装稳定版地址 : https://redis.io/download/#redis-downloads
在linux中安装redisC语言编译环境,centos7,有gcc只需通过命令检测是否有gcc,
gcc --version
检查是否有gcc环境,如果有的话- 解压
tar -zxvf 压缩包名字
- 进入redis文件夹
make
把redis编译成c文件make install
安装
我在这里遇到了一个问题,因为版本错误,下载成stack当时没注意版本…
redis目录简介
启动redis(第一个例子)
-
推荐后台启动redis,因此,需要进入redis目录下,
cp redis.conf /etc/redis.conf
复制的目录可以是任(自己知道) -
将后台启动改为允许,daemonize no 改成yes,在etc目录下
vi redis.conf
-
/daem
搜索一下daemonize no在哪里,vi(vim)不要忘记命令,然后i
进入编辑模式,把no改成yes,:wq
保存退出 -
在
/usr/local/bin
后台将在目录下启动/etc
里边的redis.conf,命令:redis-server /etc/redis.conf
-
redis-cli
连接上redis -
嘿嘿!第一个例子
[root@jingZhi bin]# redis-cli 127.0.0.1:6379> set heiKey ha OK 127.0.0.1:6379> get heiKey "ha" 127.0.0.1:6379> ping PONG
-
关闭redis后台命令:
shutdown
然后exit
, 说说我遇到的问题。第二次,我不能先关掉它,因为我检查了过程,发现了它redis后天还在运行,但是哈,之后直接关闭了我的服务器 shutdown是直接把电源关了,就是退出和linux系统的连接了,需要在阿里云管理平台开启服务器 总之就是关闭后台redis这个我暂时没解决,就是关不掉后台 所以就exit
退出这个端口号就行了,让他一直在后端运行吧 -
查看进程
ps -ef | grep redis
redis来源:Merz
redis介绍
- 默认16个数据库,默认使用0数据库
- select 1切换到1数据库
五大数据类型
key键操作
- 这不是数据类型
使用
-
set key value
设置key-value -
取出值
get key
keys *
查看当前库所有key,匹配keys*1
exists key
判断某个key是否存在type key
查看key(的值)类型del key
删除指定keyunlink key
根据value选择非阻塞删除 表面上先删除,真正的删除在后续异步操作expire key 20
设置指定key20秒后过期ttl key
查看key还有多少秒过期,-1永远不过期,-2已经过期select 3
选择数据库3,默认是0,redis有16个库dbsize
查看有多少个keyflushdb
删除当前库所有keyflushall
删除所有库所有key,不常用
127.0.0.1:6379> set HeiKey ha
OK
127.0.0.1:6379> set qieKey xi
OK
127.0.0.1:6379> keys *
1) "qieKey"
2) "HeiKey"
127.0.0.1:6379> exists k1
(integer) 0
127.0.0.1:6379> exists qieKey
(integer) 1
127.0.0.1:6379> type HeiKey
string
127.0.0.1:6379> del qieKey
(integer) 1
127.0.0.1:6379> keys *
1) "HeiKey"
127.0.0.1:6379> set naKey ni
OK
127.0.0.1:6379> expire HeiKey 20
(integer) 1
127.0.0.1:6379> ttl HeiKey
(integer) 9
127.0.0.1:6379> ttl HeiKey
(integer) -2 #-2表示已经过期
127.0.0.1:6379> ttl naKey
(integer) -1 #-1表示永远不过期
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379> keys *
1) "naKey"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
String
说明
- 二进制安全的,string可以包含任何数据,例如图片,视频等
- value最大长度为512M
- String数据结构是简单动态字符串(SDS),类似java的arraylist,个人感觉也类似go的切片,
- 长度小于1M是,动态加倍扩容,超过1M时候,每次+1M
常用命令
set keyname value
设置get keyname
取值append keyname value
追加内容strlen keyname
查看key值长度setnx keyname value
当key不存在时,设置key值incr keyname
对数字值操作+1decr keyname
对数字值操作-1incrby keyname n
对数字值操作+ndecrby keyname n
对数字值操作-nmset k1 v1 k2 v2
设置多个值mget k1 k2
取出多个值msetnx
懂得都懂,有一点说明,一旦有一个存在则设置都失败getrange keyname 0 3
范围取值,0代表第一个,以此……setrange keyname 3 覆盖的内容
3代表第四个开始覆盖setex keyname n valuename
设置一个值,过期时间是n,值是valuenamettl keyname
查看keyname过期时间getset keyname valuename
设置valuename新值同时查看旧值- 这一块内容需要做一个思维脑图,帮助记忆
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v100
OK
127.0.0.1:6379> set k2 v200
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v100"
127.0.0.1:6379> set k1 v1100
OK
127.0.0.1:6379> get k1
"v1100"
127.0.0.1:6379> append k1 abc
(integer) 8
127.0.0.1:6379> get k1
"v1100abc"
127.0.0.1:6379> strlen k1
(integer) 8
127.0.0.1:6379> setnx k1 asdf
(integer) 0
127.0.0.1:6379> setnx k3 v300
(integer) 1
127.0.0.1:6379> set k4 100
OK
127.0.0.1:6379> incr k4
(integer) 101
127.0.0.1:6379> get k4
"101"
127.0.0.1:6379> decr k4
(integer) 100
127.0.0.1:6379> incrby k4 7
(integer) 107
127.0.0.1:6379> decrby k4 8
(integer) 99
127.0.0.1:6379> get k4
"99"
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
127.0.0.1:6379> msetnx k11 v11 k1 v11
(integer) 0
127.0.0.1:6379> mset k11 v11 k22 v22
OK
127.0.0.1:6379> set name wangdahai
OK
127.0.0.1:6379> get name
"wangdahai"
127.0.0.1:6379> getrange name 0 3
"wang"
127.0.0.1:6379> setrange name 3 heiha
(integer) 9
127.0.0.1:6379> get name
"wanheihai"
127.0.0.1:6379> setex age 20 value30
OK
127.0.0.1:6379> ttl age
(integer) 17
127.0.0.1:6379> get age
"value30"
127.0.0.1:6379> getset name lalalal
"wanheihai"
127.0.0.1:6379> get name
"lalalal"
127.0.0.1:6379>
List
说明
- 单键多值
- 底层是一个双向链表,两端操作方便,中间操作困难
- 按照插入顺序排序,添加元素到头部或者尾部
- 顺序放入,逆序取出,感觉有点像入栈,出栈
常用命令
lpush/rpush k1 v1 v2 v3
设置一key多valuelrange keyname 0 -1
从左往右取值,0到-1 可以取到所有的值lpop/rpop keyname
从左/右出来一个值,并且删除这个值。rpoplpush k1 k2
k1右边吐出1个值放到k2左边,把k1的最右边的放在k2的第一个了,其他的往后推1,lindex k1 1
获取下标为2的元素llen keyname
获取keyname长度linsert keyname before/after value newvalue
在keyname的value前/后插入newvaluelrem keyname n value
删除n个从keyname的value左到右,lset keyname n newvalue
用newvalue覆盖keyname的下标为n的元素
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> rpush k2 v1 v2 v3
(integer) 3
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> lpop k1
"v3"
127.0.0.1:6379> lpop k1
"v2"
127.0.0.1:6379> lrange k1 0 -1
1) "v1"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> lpush k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> rpush k2 v11 v12 v13
(integer) 3
127.0.0.1:6379> rpoplpush k1 k2
"v1"
127.0.0.1:6379> lrange k2 0 -1
1) "v1"
2) "v11"
3) "v12"
4) "v13"
kkk
127.0.0.1:6379> lrange k1 0 -1
1) "v3"
2) "v2"
127.0.0.1:6379> lindex k1 1
"v2"
127.0.0.1:6379> llen k1
(integer) 2
127.0.0.1:6379> linsert k1 before v3 newv3
(integer) 3
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "v3"
3) "v2"
127.0.0.1:6379> linsert k1 after v3 newv4
(integer) 4
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "v3"
3) "newv4"
4) "v2"
127.0.0.1:6379> lrem k1 1 v3
(integer) 1
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "newv4"
3) "v2"
127.0.0.1:6379> lset k1 1 newv33
OK
127.0.0.1:6379> lrange k1 0 -1
1) "newv3"
2) "newv33"
3) "v2"
list
- 将链表和ziplist结合起来组成quicklist,就是将多个ziplist使用双向指针穿起来使用
Set
说明:
- 自动去重,底层是hash表,复杂度0(1),
- 其他就和List很像了
底层数据结构
- 字典,dict,字典是哈希表实现的
常用命令:
sadd key value1 value2....
添加值smembers key
取出该集合所有值sismember key value
判断key集合是否含有valuescard key
返回key的元素个数srem k1 v1 v3
删除k1集合的v1 v3元素spop k1
随机吐出k1集合一个元素,吐出同时删除了srandmember k1 n
随机取出n个值,不会从集合删除smove sourcekey destinationkey value
把sourcekey中value移到destinationkeysinter k1 k2
返回交集sunion k1 k2
返回并集sdiff k1 k2
返回差集。包含k1不包含k2的
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd k1 v1 v2 v3
(integer) 3
127.0.0.1:6379> smembers k1
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> sismember k1 v2
(integer) 1
127.0.0.1:6379> sismember k1 v4
(integer) 0
127.0.0.1:6379> srem k1 v1 v3
(integer) 2
127.0.0.1:6379> smembers k1
1) "v2"
127.0.0.1:6379> sadd k1 v3 v4
(integer) 2
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
3) "v2"
127.0.0.1:6379> spop k1
"v4"
127.0.0.1:6379> spop k1
"v3"
127.0.0.1:6379> sadd k1 v1 v2 v3 v4 v5 v3
(integer) 4
127.0.0.1:6379> smembers k1
1) "v3"
2) "v1"
3) "v2"
4) "v4"
5) "v5"
127.0.0.1:6379> spop k1
"v1"
127.0.0.1:6379> srandmember k1 2
1) "v3"
2) "v2"
127.0.0.1:6379> scard k1
(integer) 4
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
4) "v5"
127.0.0.1:6379> spop k1
"v5"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> sadd k2 v21 v23 v24 v25
(integer) 4
127.0.0.1:6379> smove k1 k2 v2
(integer) 1
127.0.0.1:6379> smembers k2
1) "v25"
2) "v21"
3) "v24"
4) "v23"
5) "v2"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v3"
127.0.0.1:6379> sadd k1 v2 v23
(integer) 2
127.0.0.1:6379> sinter k1 k2
1) "v2"
2) "v23"
127.0.0.1:6379> smembers k1
1) "v4"
2) "v2"
3) "v3"
4) "v23"
127.0.0.1:6379> smembers k2
1) "v21"
2) "v25"
3) "v2"
4) "v23"
5) "v24"
127.0.0.1:6379> sunion k1 k2
1) "v25"
2) "v21"
3) "v4"
4) "v2"
5) "v3"
6) "v24"
7) "v23"
127.0.0.1:6379> disff k1 k2
(error) ERR unknown command `disff`, with args beginning with: `k1`, `k2`,
127.0.0.1:6379> sdiff k1 k2
1) "v4"
2) "v3"
Hash
说明
- 键值对集合
- redis的hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
- 类似java里边的map<String,object>
- 两种存储方式,一是IDkey,对映名字,年龄啦什么的,二是id+名字—对应值
数据结构
- 两种,ziplist,hashtable
- 当field-value长度较短且个数较少,使用ziplist,否则使用hashtable
常用命令
-
hset key field value
key集合field键赋值value,例子hset user:1001 name jingzhi
-
hget key field
从key集合filed取出value -
hmset key field1 value1 field2 value2...
批量设置hash值 -
hexists key field
产看hash表key中,给定field是否存在 -
hkeys key
查看key的所有field -
hvals key
查看key所有的value -
hincrby key field n
key哈希表中field域值增n,n可以是负数 -
hsetnx key field value
当且仅当field不存在时候给field值设置为value
127.0.0.1:6379> hset user:1000 id 1
(integer) 1
127.0.0.1:6379> hset user:1000 name jingzhi
(integer) 1
127.0.0.1:6379> hget user:1000 name
"jingzhi"
127.0.0.1:6379> hmset user:1002 id 2 name lisi age 21
OK
127.0.0.1:6379> hexists user:1000
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists user:1000
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists user:1000 name
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
127.0.0.1:6379> hvals user:1002
1) "2"
2) "lisi"
3) "21"
127.0.0.1:6379> hincrby user:1002 age 7
(integer) 28
127.0.0.1:6379> hsetnx user:1002 age 30
(integer) 0
127.0.0.1:6379> hsetnx user:1002 gender 2
(integer) 1
127.0.0.1:6379> hkeys user:1002
1) "id"
2) "name"
3) "age"
4) "gender"
Zset有序集合
说明
- 有序集合,没有重复元素
- 和set区别,都关联了一个score,根据评分,按章从低到高排序,成员唯一,评分可以重复
- 可以根据评分获取一个范围的元素
数据结构
- 一方面等价于Map给每一个元素value赋予一个权重score,另一方面类似于TreeSet,内部元素按照权重score进行排序,得到每个元素的名次
- 底层两个数据结构
- hash,hash的作用就是关联元素value和权重score,保证value的唯一性,
- 跳跃表,目的在于给value元素排序,根据score范围获取元素列表
常用命令
zadd key score1 value1 score2 value2...
将一个或者多个value元素以及score添加集合到keyrange rank 0 -1 withscores
查看所有元素及其分数,0和-1代表下标,0到-1是所有zrangebyscore key n m[withscores]
从小到大显示,区间是n——mzrevrangebyscore key m n[withscores]
从大到小显示,区间是m——nzincrby key n value
给元素value添加n分zrem key value
删除key集合value元素zcount key n m
统计n 到 m区间的元素个数zrank key value
查询该value元素在key集合的排名,排名从0开始
127.0.0.1:6379> zadd rank 99 bainiangudu 98 shuimiangeming 96 wenhuakulv 97 wangyuancheng
(integer) 4
127.0.0.1:6379> zrange rank 0 -1
1) "wenhuakulv"
2) "wangyuancheng"
3) "shuimiangeming"
4) "bainiangudu"
127.0.0.1:6379> zrange rank 0 -1 withscores
1) "wenhuakulv"
2) "96"
3) "wangyuancheng"
4) "97"
5) "shuimiangeming"
6) "98"
7) "bainiangudu"
8) "99"
1
127.0.0.1:6379> zrangebyscore rank 97 99
1) "wangyuancheng"
2) "shuimiangeming"
3) "bainiangudu"
127.0.0.1:6379> zrevrangebyscore rank 98 96
1) "shuimiangeming"
2) "wangyuancheng"
3) "wenhuakulv"
127.0.0.1:6379> zincrby rank 9 shuimiangeming
"107"
127.0.0.1:6379> zrem rank wangyuancheng
(integer) 1
127.0.0.1:6379> zcount rank 1 110
(integer) 3
127.0.0.1:6379> zrank rank bainiangudu
(integer) 1
127.0.0.1:6379> zrange rank 0 -1 withscores
1) "wenhuakulv"
2) "96"
3) "bainiangudu"
4) "99"
5) "shuimiangeming"
6) "107"
配置文件(听了一边,没啥好说的)
- 只支持bytes,不支持bits
订阅发布
- pub/sub,发布订阅是一种消息通道模式
SUBSCRIBE channel1
publish channel1 hello
127.0.0.1:6379> SUBSCRIBE channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hei"
#另一个会话
127.0.0.1:6379> publish channel1 hei
(integer) 1
127.0.0.1:6379>