redis介绍

sql数据库与nosql数据库的区别

redis是一种非关系型数据库,与关系型数据库将数据存储在数据表的行和列中不同,非关系型数据库将数据通过大块组合在一起。非关系型数据通常存储在数据集中,根据数据及其特性,选择不同的存储和提取方式。
nosql数据库的扩展方式也和sql数据库不同,sql数据库通过提升单台服务器性能来支持高并发,而nosql数据库可以通过分布式支持高并发。
sql数据库可以将数据库存储于磁盘中,而nosql数据库运行在内存中,没有持久化的功能,重启服务器后数据就会消失,但是redis数据库提供持久化功能,可以将数据存储于磁盘中方便重启后读取,保证数据不会丢失。
在生产环境中,redis搭配mysql使用,redis将mysql中的高热数据存储在缓存中,提升访问速度。

redis介绍

redis是一个开源的,使用c语言编写的nosql数据库,运行于内存中支持持久化(需要手动开启),采用键值对的方式进行存储。
redis数据库是单进程模式(也可以创建多个进程),redis为每一个主进程分配一个资源池,
主进程和子进程公用这个资源池,但是redis的时机处理速度完全依赖主进程的执行效率,
当多个客户端同事访问redis服务器,服务器的处理能力会有一定的下降。
如果开启多个redis进程,redis在提高处理能力的同时会对cpu造成很大压力,所以根据实际需求
决定开启多少个redis进程。

redis的优势

(1)具有很高的数据读写速度,读最高达到110k次/s,写入最高达到81k次/s。
(2)支持数据持久化
(3)支持数据备份
(4)支持多种的数据类型:
string(二进制)
lists(列表)
hashes(散列值)
sets(无序集合)
sorted set(有序集合)

redis安装

首先安装redis的依赖软件
[root@localhost ~]# yum install -y gcc gcc-c++ make
[root@localhost ~]# yum install -y gcc*

[root@localhost ~]# tar zxvf redis-5.0.7.tar.gz -C /opt
[root@localhost redis-5.0.7]# make		#由于redis已经自行./configure了,目录下含有makefile文件所以不需要./configure
[root@localhost redis-5.0.7]# make PREFIX=/usr/local/redis install		#指定安装目录

[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh		#执行这个脚本
#然后一直回车,当出现Please select the redis executable path []时,输入/usr/local/redis/bin/redis-server
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port           : 6379		#端口号
Config file    : /etc/redis/6379.conf		#配置文件位置
Log file       : /var/log/redis_6379.log	#日志文件位置
Data dir       : /var/lib/redis/6379		#数据文件位置
Executable     : /usr/local/redis/bin/redis-server	#可执行文件路径
Cli Executable : /usr/local/redis/bin/redis-cli		#客户端命令工具

#/redis/bin目录下的所有文件创建软连接方便系统识别
[root@localhost utils]# ln -s /usr/local/redis/bin/ /usr/local/bin
[root@localhost utils]# ln -s /etc/init.d/redis_6379 /usr/local/bin/

[root@localhost utils]# vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.218.214	70行修改监听的ip地址

reids_6379 start	#启动服务
[root@localhost ~]# netstat -anpt |grep 6379
tcp        0      0 192.168.218.214:6379    0.0.0.0:*               LISTEN      83725/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      83725/redis-server

redis基础操作

redis-cli登录redis

#通过本地登录
[root@localhost ~]# redis-cli 
127.0.0.1:6379>

#远程登录
[root@localhost ~]# redis-cli -h 192.168.218.214 -p 6379	-h指定ip地址,-p指定端口
192.168.218.214:6379>

set创建key/修改键值,get查看键值,del删除键,keys查看键

#set的格式为:set 键名 键值
192.168.218.214:6379> set new caster
OK
192.168.218.214:6379> set new ruler
OK

#get的格式为:get 键名
192.168.218.214:6379> get new
"ruler"

#keys用于查看键,可以进行正则匹配
192.168.218.214:6379> keys *
1) "new"
2) "game"
192.168.218.214:6379> keys n*
1) "new"
192.168.218.214:6379> keys n??
1) "new"

#del的格式为:del key 键名
192.168.218.214:6379> del key game
(integer) 1
192.168.218.214:6379> keys *
1) "new"

exists判断键是否存在,type查看键的数据类型

#exists的格式为:exists 键名	如果键存在则返回1,如果不存在则返回0
192.168.218.214:6379> keys *
1) "new"
2) "saber"
192.168.218.214:6379> exists game
(integer) 0
192.168.218.214:6379> exists saber
(integer) 1

#type的格式为:type 键名
192.168.218.214:6379> type new
string

rename对键重命名或覆盖键值

#rename的格式为:rename 源键名 变更后的键名	renamenx表示如果有目标键名,那么不进行更改(没有就正常更改)
192.168.218.214:6379> rename new saber
OK
192.168.218.214:6379> keys *
1) "saber"
192.168.218.214:6379> get saber
"caster"
192.168.218.214:6379> set new saber
OK
192.168.218.214:6379> renamenx new saber
(integer) 0

select切换库,move移动键

redis默认含有16个库,库的下标从0开始,0-15。通过select切换数据库。

#select的格式为:select 库的下标,切换库后,ip地址后会多一个下标,数据库0不显示下标
192.168.218.214:6379> select 1
OK
192.168.218.214:6379[1]> select 0
OK
192.168.218.214:6379>

#move的格式为:move 当前库的键 目标库
192.168.218.214:6379> keys *
1) "db_number"
2) "ne"
3) "saber"
192.168.218.214:6379> move ne 1
(integer) 1
192.168.218.214:6379> get ne		#移动后,当前库查看不了该键
(nil)
192.168.218.214:6379> select 1
OK
192.168.218.214:6379[1]> get ne		#在移动后的库中才能查看
"no"
192.168.218.214:6379[1]>

redis数据类型

string数据类型

string是redis最基本的数据类型,最大存储512M的数据,string是一种二进制数据,可以存储任何数据例如数字、图片、序列化对象等。
string中常用的命令:set、get、append、strlen等

#setget前面解释过了,这里不做解释,append追加键值并返回追加后的长度,如果键不存在,则创建该键并赋予键值。
#append的格式为:append 键名 键值
192.168.218.214:6379> keys *
1) "db_number"
2) "saber"
192.168.218.214:6379> append berserk ber
(integer) 3		#注意:返回的是键值的长度不是键值
192.168.218.214:6379> keys *	#可以看到会创建一个键
1) "db_number"
2) "berserk"
3) "saber"
192.168.218.214:6379> append berserk serk	#对键值进行追加长度
(integer) 7
192.168.218.214:6379> get berserk
"berserk"

#strlen获取指定键值的长度,格式为:strlen 键名
192.168.218.214:6379> strlen saber
(integer) 6
192.168.218.214:6379> get saber
"caster"

#getset获取键值的同时给键设置新值,先获取再设置。
getset 
192.168.218.214:6379> getset number 69
"19"
192.168.218.214:6379> get number
"69"

#setex指定键值的过期时间,单位为妙,格式为:setex键名 过期时间 键值。setex可以在设置过期时间的同时修改键值。
192.168.218.214:6379> setex number 10 10
OK
192.168.218.214:6379> get number
"10"
192.168.218.214:6379> ttl number		#通过ttl查看还有多长时间键过期
(integer) -2		#在redis中-2表示过期,-1表示最大
192.168.218.214:6379> get number		#过期后无法查看到键值
(nil)
#mset/mget/msetnx批量设置
192.168.218.214:6379> mset a 1 b 2 c 3
OK
192.168.218.214:6379> keys *
1) "b"
2) "c"
3) "a"
192.168.218.214:6379> mget a b c
1) "1"
2) "2"
3) "3"
192.168.218.214:6379> msetnx d 4 e 5 f 6	#msetnx比较特殊,如果批量创建的键值对原本不存在则创建成功,只要有一个存在则创建失败。
(integer) 1
192.168.218.214:6379> keys *
1) "f"
2) "c"
3) "d"
4) "e"
5) "b"
6) "a"
192.168.218.214:6379> msetnx d 4 g 7
(integer) 0
#incr/decr/incrby/decrby
#incr键值自增1,decr键值自减1。incrby,decrby键值自增/自减指定整数。使用incr和decr时键值必须为整数。
192.168.218.214:6379> set number 20
OK
192.168.218.214:6379> get number
"20"
192.168.218.214:6379> incr number
(integer) 21
192.168.218.214:6379> decr number
(integer) 20
192.168.218.214:6379> incrby number 10
(integer) 30
192.168.218.214:6379> decrby number 11
(integer) 1

list数据类型

列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素。对于list数据类型无法通过get查看键值,只能通过lrange查看列表元素。

#lpush/lpushx/lrange/lpop/llen
#lpush:在列表元素的左侧依次插入元素,如果没有该列表则创建并插入。格式为:lpush key 元素值 元素值 ...
#lrange:取从位置索引start到stop的所有元素,索引以0开始。格式为:lrange key 开始的索引 结束的索引
127.0.0.1:6379> lpush watch a b c d e 
(integer) 5
127.0.0.1:6379> get watch		#无法通过get查看
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lrange watch 0 -1	索引0表示列表中第一个元素,-1表示列表中最后一个元素
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
#lpush的插入方式是先插入a,此时列表中仅有a这一个元素,然后在a的左侧插入b,以此类推,列表中第一个元素为e,最后一个为a。
127.0.0.1:6379> lrange watch 0 0
1) "e"
127.0.0.1:6379> lrange watch -1 -1
1) "a"

#lpushx:插入元素值并返回列表元素数量。格式为:lpushhx key 元素值
127.0.0.1:6379> lpushx watch f
(integer) 6
127.0.0.1:6379> lrange watch 0 -1
1) "f"
2) "e"
3) "d"
4) "c"
5) "b"
6) "a"

#lpop:移除列表中的第一个元素并显示移除的元素,即移除索引为0的元素。格式为:lpop key
127.0.0.1:6379> lpop watch			#删除后会显示删除掉的元素
"f"
127.0.0.1:6379> lrange watch 0 0	#再查看列表元素会发现第一个元素变更了
1) "e"

#llen:获取列表中元素的数量。格式为:llen key
127.0.0.1:6379> llen watch		#之前删除一个元素,现在只有5个元素
(integer) 5
#lrem/lset/lindex/ltrim/linsert
#lrem:从头部开始删除n个值为xxx的元素,并返回删除数量。格式为:lrem key 删除的数量 删除的元素
127.0.0.1:6379> lpush sun a a b a c d
(integer) 6
127.0.0.1:6379> lrange sun 0 -1
1) "d"
2) "c"
3) "a"
4) "b"
5) "a"
6) "a"
127.0.0.1:6379> lrem sun 3 a
(integer) 3
127.0.0.1:6379> lrange sun 0 -1
1) "d"
2) "c"
3) "b"

#lset:将列表中的元素值更换为新的元素值,通过索引确定更换的元素是哪个。格式为:lset key 索引 更换后的元素值
127.0.0.1:6379> lrange sun 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
5) "a"
127.0.0.1:6379> lset sun 3 v
OK
127.0.0.1:6379> lrange sun 0 -1
1) "d"
2) "c"
3) "b"
4) "v"
5) "a"

#lindex:获取某个索引的元素。格式为:lindex key 索引
127.0.0.1:6379> lindex sun 3
"v"

#ltrim:仅保留位置索引从start到stop的元素,其他元素剔除。剔除其他元素后会根据现有元素重新排列索引。格式为:ltrim kkey start stop
127.0.0.1:6379> lrange sun 0 -1
1) "d"
2) "c"
3) "b"
4) "v"
5) "a"
127.0.0.1:6379> ltrim sun 2 4
OK
127.0.0.1:6379> lrange sun 0 -1
1) "b"
2) "v"
3) "a"
127.0.0.1:6379> lindex sun 3
(nil)
127.0.0.1:6379> lindex sun 2
"a"

#linsert:从第一个元素开始在元素前或元素后插入新元素
#也就是说如果一个列表中出现多个元素值相同的元素那么会在第一个元素的前或后插入新元素。格式为:linsert key before/after 元素值 插入的元素值
127.0.0.1:6379> lpush s a b a c c
(integer) 5
127.0.0.1:6379> linsert s after c t
(integer) 6
127.0.0.1:6379> lrange s 0 -1
1) "c"
2) "t"
3) "c"
4) "a"
5) "b"
6) "a"

hash数据类型

hash用于存储对象。可以采用hash格式命名:对象类别和id构成键名。使用字段表示对象的属性,字段值为存储属性值。每一个hash可以存储4294967295个键值对。

#hset/hget/hdel/hexists/hlen/hsetnx
#hset给键设置字段和字段值,类似于mysql创建数据表和表中数据。格式为:hset key 字段名 字段值
#hget查看键的字段值。格式为:hget key 字段名
127.0.0.1:6379> hset anli aaa bbb
(integer) 1
127.0.0.1:6379> hget anli aaa
"bbb"

#hdel删除字段值。格式为:hdel key 字段名
127.0.0.1:6379> hdel anli aaa
(integer) 1
127.0.0.1:6379> hget anli aaa
(nil)

#hexists用于判断字段是否存在,如果存在返回1,不存在返回0。格式为:hexists key 字段名
127.0.0.1:6379> hexists anli aaa
(integer) 0
127.0.0.1:6379> hset anli aaa ccc
(integer) 1
127.0.0.1:6379> hexists anli aaa
(integer) 1

#hlen获取键的字段数量。格式为:hlen key 
127.0.0.1:6379> hlen anli
(integer) 1

#hsetnx给键添加字段,如果字段不存在则添加,存在则不操作。格式为:hsetnx key 字段名 字段值
127.0.0.1:6379> hsetnx anli aaa zhang
(integer) 0
127.0.0.1:6379> hsetnx anli bbb zhang
(integer) 1
127.0.0.1:6379> hget anli bbb
"zhang"
hincrby/hgetall/hkeys/hvals/gmget/gmset
#hincrby给字段值增加指定整数。格式为:hincrby key 字段名 增加的整数
127.0.0.1:6379> hset anli ccc 10
(integer) 1
127.0.0.1:6379> hget anli ccc
"10"
127.0.0.1:6379> hincrby anli ccc -2		#如果增加的是负数,则表示减少
(integer) 8
127.0.0.1:6379> hincrby anli ccc 3
(integer) 11

#hgetall查看键的所有字段和字段值。格式为:hgetall key
127.0.0.1:6379> hgetall anli
1) "aaa"
2) "ccc"
3) "bbb"
4) "zhang"
5) "ccc"
6) "11"

#hkeys查看键的所有字段。格式为:hkeys key
127.0.0.1:6379> hkeys anli
1) "aaa"
2) "bbb"
3) "ccc"

#hvals查看所有字段值。格式为:hvals key
127.0.0.1:6379> hvals anli
1) "ccc"
2) "zhang"
3) "11"

#hmget批量获取字段值。格式为:hmget key 字段名 字段名 ...
127.0.0.1:6379> hmget anli aaa bbb 
1) "ccc"
2) "zhang"

#hmset批量设置字段和字段值,这里字段值需要加上""。格式为:hmset key 字段名 "字段值" 字段名 "字段值" ...
127.0.0.1:6379> hmset anli a "aa" b "bb" c "cc"
OK
127.0.0.1:6379> hmget anli a b c
1) "aa"
2) "bb"
3) "cc"

set数据类型

set类型为无序集合,元素类型为string类型,元素具有唯一性。不允许存在重复的元素,多个集合类型之间看可以进行并集、交集和差集运算。

sadd/smembers/scard/sismember
#sadd在键中随机位置插入数据,如果插入的数据中含有已经存在的,则跳过并插入后面的数据。格式为:sadd key 元素 元素 ...
#smembers查看插入的数据。格式为:smembers key
127.0.0.1:6379> sadd mytest a b c
(integer) 3
127.0.0.1:6379> sadd mytest c d e
(integer) 2
127.0.0.1:6379> smembers mytest
1) "b"
2) "c"
3) "a"
4) "d"
5) "e"

#scard查看键含有多少元素。格式为:scard key
127.0.0.1:6379> scard mytest
(integer) 5

#sismember判断元素是否存在,如果存在返回1,不存在返回0。格式为:sismember key 元素
127.0.0.1:6379> sismember mytest a
(integer) 1
127.0.0.1:6379> sismember mytest h
(integer) 0
spop/srem/srandmember/smove
#spop随机删除键中一个元素并返回该元素。格式为:spop key
127.0.0.1:6379> spop mytest
"b"
127.0.0.1:6379> smembers mytest
1) "e"
2) "a"
3) "c"
4) "d"

#srem从键中移除元素,如果移除的元素不存在则不处理,只移除存在的元素。格式为:srem key 元素 元素 ...
127.0.0.1:6379> srem mytest e d c g
(integer) 3
127.0.0.1:6379> smembers mytest
1) "a"

#srandmember随即返回键中某个元素。格式为:srandmember key
127.0.0.1:6379> smembers mytest
1) "a"
127.0.0.1:6379> sadd mytest a b c d e
(integer) 4
127.0.0.1:6379> smembers mytest
1) "e"
2) "b"
3) "c"
4) "a"
5) "d"
127.0.0.1:6379> srandmember mytest
"c"
127.0.0.1:6379> srandmember mytest
"e"

#smove将键中元素移动到另一个键中,如果另一个键不存在则创建该键并把元素移过来。格式为:smove 源键 目标键 源键的元素
127.0.0.1:6379> keys *
1) "key"
2) "myset"
3) "mytest"
4) "watch"
5) "anli"
6) "anlli"
127.0.0.1:6379> smove mytest mytest1 a
(integer) 1
127.0.0.1:6379> keys *
1) "key"
2) "myset"
3) "mytest"
4) "watch"
5) "anli"
6) "anlli"
7) "mytest1"
127.0.0.1:6379> smembers mytest1
1) "a"
127.0.0.1:6379> smembers mytest
1) "e"
2) "b"
3) "c"
4) "d"

sorted set数据类型

有序集合,元素类型为string,元素具有唯一性,不能重复。每个元素都会关联一个double类型的分数表示权重,通过权重的大小升序排序,元素的分数可以相同。

#zadd/zcard/zcount/zrem/zincrby/zscore/zrange/zrank
#zadd创建键并添加一个具有分数权重的元素。格式为:zadd key 分数 元素 分数 元素 ...
127.0.0.1:6379> zadd game 10 zhangsan 20 lisi
(integer) 2

#zrange用于查看键中元素。格式为:zrange key 开始索引 结束索引。如果加上withscores会将分数一并显示。
127.0.0.1:6379> zrange game 0 -1 
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> zrange game 0 -1 withscores		#同时显示分数
1) "zhangsan"
2) "10"
3) "lisi"
4) "20"

#zcount对满足分数区间的元素进行统计。格式为:zcount key 分数 分数
127.0.0.1:6379> zcount game 5 15
(integer) 1
127.0.0.1:6379> zcount game 15 5
(integer) 0

#zrem删除键中元素并返回删除的数量。格式为:zrem key 元素 元素 ...
127.0.0.1:6379> zrem game zhangsan lisi
(integer) 2

zincrby增加/减少键中元素的分数并返回更改后的分数。格式为:zincrby key 分数 元素
127.0.0.1:6379> zadd game 10 zhangsan 20 lisi 13 wangwu
(integer) 3
127.0.0.1:6379> zincrby game 3 wangwu
"16"
127.0.0.1:6379> zincrby game -3 lisi
"17"

#zscore获取元素的分数。格式为:zscore key 元素
127.0.0.1:6379> zscore game lisi
"17"
127.0.0.1:6379> zscore game zhangsan
"10"

#zcard获取键中元素数量。格式为:zcard key
127.0.0.1:6379> zcard game
(integer) 3

#zrank获取键中元素的索引。格式为:zrank key 元素
127.0.0.1:6379> zrank game lisi
(integer) 2
127.0.0.1:6379> zrank game zhangsan
(integer) 0
127.0.0.1:6379> zrank game wangwu
(integer) 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值