一、NoSQL 概述
NoSQL(Not Only SQL):
非关系型数据库,适用于高并发的读写发生时,实现海量数据的高效率的存储与访问,从而实现一高可用性与可扩展性。
NoSQL 主流产品:
mongoDB、Redis、Cassandra、CouchDB...
NoSQL 四大分类:
键值对存储、列存储、文档存储(mongoDB)、图形数据库
NoSQL 特点:
易扩展、灵活的数据模型、大数据量高性能、高可用
二、Redis 概述
Redis:
是一款开源的、采用 C 语言开发、采用键值对的形式、具有高性能的数据库。
数据类型:(具体内容参见另一篇博客:https://www.wslhome.top/articles/2020/06/16/1592312645001.html)
字符串类型、散列类型、列表类型、集合类型、有序集合类型
Redis 应用场景:
缓存、任务队列、分布式集群架构中的 session 分离、网站访问统计、应用排行榜、数据过期处理
三、Redis 安装
-
创建文件夹、并进入文件夹下
mkdir /home/redis cd /home/redis
-
下载 redis
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
-
解压 redis
tar -xvf redis-5.0.4.tar.gz
-
安装编译环境 GCC
yum install gcc-c++
-
进入 redis5.0.4 目录
cd redis-5.0.4/
-
编译 redis
make
-
安装 redis:PREFIX 参数指定 redis 的安装目录
make install PREFIX=/usr/local/redis
-
修改配置:
cd /usr/local/redis #进入目录 cp /home/redis/redis-5.0.4/redis.conf single.conf #拷贝文件
(1)打开 single.conf 文件
vim single.conf
(2)修改配置:
#bind 127.0.0.1 #本机访问注释掉
port 6379 #端口号,可以修改
protected-mode no #关闭保护
daemonize yes #开启后台启动(不开启运行后就不能做其余操作)
#保存退出 按esc输入:wq
(3)设置开机自启动
./install_server.sh #redis 安装目录中有util文件夹,文件夹中有install.sh文件, 进入目录执行,一值回车
mv /etc/init.d/redis_6379 /etc/init.d/redisd #可以看见Copied /tmp/6379.conf=>/etc/init.d/redis_6379
chkconfig --add redisd #升级为系统服务
systemctl start redisd #用linux系统命令systemctl启动redis服务
systemctl daemon-reload #刷新配置
- 启动服务
cd /usr/local/redis/ redis-server redis.conf #开启服务端 redis-cli -p 6379 #如果没有更改端口直接 redis-cli
10.查看 redis 是否启动
ps aux|grep redis
11.测试
./redis-cli -h 127.0.0.1 -p 6379 #进入redis安装目录
set test 123
get test
四、Jedis 连接
jedis 是 redis 官网首选的 java 语言开发包 github:github.com/xetorthio/jedis
package jedis;
#导入jedis-2.9.0.jar与commons-pool2.jar
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class Demo {
String host = "192.168.241.128";
int port = 6379;
@Test
//单例
public void test1() {
Jedis jedis = new Jedis(host,port);
jedis.set("name", "张三");
String name = jedis.get("name");
System.out.println(name);
}
@Test
//连接池
public void test2() {
//设置连接池
JedisPoolConfig config=new JedisPoolConfig();
//设置最大允许连接数
config.setMaxTotal(50);
//设置最大的空闲连接
config.setMaxIdle(10);
//1. 创建Jeids连接池对象
JedisPool jdJedisPool=new JedisPool(config, host, port);
Jedis jedis = null;
try {
jedis = jdJedisPool.getResource();
jedis.set("name", "李四");
String name = jedis.get("name");
System.out.println(name);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(jedis !=null) jedis.close();
if(jdJedisPool != null) jdJedisPool.close();
}
}
}
五、Redis 命令
- 字符串(String)
set name test #赋值
get name #取值
getset name lisi #取值之后赋值
del name #删除
incr num #数值递增一,不存在设置为0在+1
decr num #数值减一,不存在设置为0在-1
incrby num 5 #指定增加数值
decrby num 3 #指定减少数值
append num 1 #在原有值后面增加字符串
- 哈希(hash)
hset test name li age 12 #增加一组
hmset user name zhangsang password 123 #增加user中的name与password
hget test name #获取name
hmget user name age #获取user中的name与age
hgetall user #获取整个user
hdel test name #删除name
hdel user #删除整个hash
hincrby user age 5 #指定某个hash某个属性增加多少值
hexists user name #判断属性是否存在
hlen user #获取hash有几个属性
hkeys user #获取所有的key
hvals user #获取所有的value
- 链表(list)
lpush list1 1 2 3 #添加1 2 3 到list1 左添加
rpush list2 1 2 3 #添加 1 2 3到list2 右添加
lrange list1 0 -1 #查看有多少元素 开始元素0 结尾元素为-1
lrange list2 0 2
lpop list1 #弹出一个队首元素
rpop list2 #弹出最后一个元素
llen list1 #查看有个元素
lpushx list a #如果存在在头部插入a,不存在不插入
lpushx list1 a
lrem list1 2 1 #从头删除2个1
lrem lsit2 -2 1 #从尾删除2个1
lset list 2 abc #在list中的第二个位置插入abc
linsert list2 after abc def #在list2中的abc之后插入def
linsert list2 before abc def #在list2中的abc之前插入def
lpoplpush list1 list2 #将list1中最后一个元素弹出插入list2队列中
- 集合(set)
sadd set1 1 2 3 #添加1 2 3到set集合
srem set1 1 2 #删除12
smembers set1 #查看set1中的数据
sismember set1 a #判断a在不在set中
sdiff set1 set2 #set1 set2 的差集运算
sinter set1 set2 #交集运算
sunion set1 set2 #并集运算
scard set1 #获取集合数量
srandmember set1 #随机返回元素
sdiffstore set1 set2 set3 #将set1 与 set2 的差集存储在set3中
sinterstore set1 set2 set3 #将set1 与set2的交集存储在set3
sunionstore set1 set2 set3 #将set1与set2的并集存储在set3中
- 有序集合(sorted-set)
每一个成员都有一个成员有一个分数与之关联,位置有序
zadd so 70 zhangsang 80 sili 100 wangwu #添加张三李四王五并与分数关联
zadd so 90 zhangsang #更新张三分数
zcore so zhansang #获取zhansang分数
zcard so #查看多少元素
zrem so sili wangwuq #删除sili wangwu
zrange so 0 -1 #查看多少元素
zrange so 0 -1 withscores #显示元素与对应分数
zrevrange so 0 -1 #排名
zremrangebyrank so 0 2 #删除0-2元素
zremrangebyscore so 90 100 #删除分数为90-100的元素
zrangebycore so 0 100 #查重0 - 100
zincrby so 20 zhangsang #增加李四分数权重
zcount so 80 100 #统计80-100的个数
- 通用命令:
keys * #查看所有的keys
keys m? #查看以m开头的key
del so user #删除key
exists so #查看so是否存在
rename com com1 #重命名
expire key seconds #设置使用时间
expireat key timestamp #设置时间戳
ttl key #获取剩余时间 -1不存在 -2过期
pttl key
persist key #转化为永久
type so #获取so的类型
keys u[st]er #st任意一个字符[]匹配一个指定符号
六、高级数据类型:Bitmaps、HyperLogLog、GEO
- bitmaps
采用计算机中最小存储单位 bit 进行存储。类似以时间换空间。
在使用过程中,如果是连续数且比较大的化,则减去一个属,否则可能造成较为耗时
#getbit key offset
#setbit key offset value
setbit num 2 1
getbit num 2)
#bitop {and/or/not/xor} destkey key1 key2
#对key按位进行交并补非异或的错做,将结果保存到destkey中《and\or\not\xor》
bitop or key key1 key2 key3 #将key123进行异或操作后存入key中
bitcount key #统计key中1的数量:
- HyperLogLog:数据基数统计
对数据基数进行统计,但是需要注意的是,他只是用于统计,没有具体的数据
pfadd key element #添加数据
pfcount key #统计数据
pfmerge destkey sourcekey #数据与合并
PS:
HyperLogLog 核心是基数估算算法,最终结果有误差(0.81%)
存储空间较小(内存 12K)
pfadd 命令不是一次分配 12K,而实基数增大而增大
pfmerge 合并后张勇的存储空间未 12K,无论之前数据量多大
- GEO:
常用于类似坐标操作
#添加坐标点
#geoadd key longitude latitude member
geoadd geos 1 1 a
#获取坐标点:
#geopos key member
geopos geos a
#计算坐标距离
geodist key member 1 member 2
#获取坐标范围内的数据:
#georadius key logintude latitude radius m\km\ft\mi
georadius geos 1.5 1.5 90 km
#根据点求范围内数据:
#georadiusbymember key member radius m\km\ft\mi
georadiusbymember ges 1 1800 km
#获取指定点的hash值
geohash key member
七、Redis 特性与持久 redis
- Radis 是个多数据库的,最多支持 16 个数据库,通过 select num 进行选择
select 1 #选择数据库
move so 1 #将so移动到1号数据库
ping #测试服务器是否联通
quit #退出
dbsize #看数据库有多少key
flushall #清除所有库
flushdb #清除所在库的数据
- 支持事务:multi(开启事务) exec(提交事务) discard(回滚事务)
- 持久化:RDB 与 AOF
RDB;默认方式,在指定时间内的将内存中的数据写入磁盘一次
AOP:以日志记录,每次启动都会读取进行构建
可以不进行持久化处理(只是使用缓存)也可以同时使用 RDB 与 AOF
具体参见另一篇博客:https://www.wslhome.top/articles/2020/06/16/1592312734423.html
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于