Redis介绍1、五种数据类型
字符串(String)、哈希(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)
2、Redis主从复制
3、Redis持久化
RDB Snapshotting方式持久化(默认方式)
客户端也可以使用save或者bgsave命令通知redis做一次快照持久化
AOF方式持久化
appendonly yes //启用日志追加持久化方式
appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全持久化,不推荐使用。
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐使用。
appendfsync no //完全依赖操作系统,性能最好,持久化没保证。
4、Redis虚拟内存
vm-enabled yes 开启虚拟内存功能
vm-swap-file /tmp/redis.swap 交换出来value保存的文件路径/tmp/redis.swapvm-max-memory268435456 redis使用的最大内存上限(256MB),超过上限后 redis开始交换value到磁盘swap文件中。建议设置为系统空闲内存的60 %-80%
vm-page-size 32 每个redis页的大小32个字节
vm-pages 134217728 最多在文件中使用多少个页,交换文件的大小 =(vm-page-size* vm-pages)4 GB
vm-max-threads 8 用于执行value对象换入换出的工作线程数量。0 表示不使用工作线程
5、Redis集群
1. 突破了单一计算机内存限制,可以利用到多个计算机的内存和
2. 通过配置多个计算机来拓展计算能力,解决网络、网卡瓶颈
6、配置文件
指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
Save分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
7、Redis的内存回收
1.Redis过期策略:删除过期时间的key值
1.定时过期
每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
2.惰性过期
只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
3.定期过期
每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
selenium+Java处理iframe切换有3种方法: 1、如果iframe有id或name,则可根据iframe的id或name切换。 2、把iframe当作页面元素,通过元素定位表达式进行切换。 3、将iframe存储到list中,然后根据ifrane的索引定位 (适合页面有多个iframe,且前两种方法无法使用)。 如果页面有多层iframe嵌套,则需要一层一层往内切换,切出iframe则只需要一次操作。selenium+Java具体Java代码示例如下:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import java.util.List;
public class Iframe {
public static void main(String[] args) { // 启动浏览器,访问目标网页,窗口最大化 System.setProperty(webdriver.chrome.driver, webdrivers/chromedriver.exe); WebDriver driver = new ChromeDriver(); driver.get(http://www.team.cn); driver.manage().window().maximize(); // 切换到iframe中,针对多层嵌套的iframe,需要一层一层往里切换,切出去只需一次 // 方法:1:根据iframe的id或name切换 driver.switchTo().frame(needit); driver.switchTo().frame(ueditor_0); // 切出iframe driver.switchTo().defaultContent(); // 方法2:把iframe当作页面元素进行切换 WebElement iframe1 = driver.findElement(By.cssSelector(iframe.needit)); driver.switchTo().frame(iframe1); WebElement iframe2 = driver.findElement(By.cssSelector(iframe[frameborder='0'])); driver.switchTo().frame(iframe2); // 切出iframe driver.switchTo().defaultContent(); // 方法3:将iframe存储到list中,然后根据ifrane的索引定位 List<WebElement> iframeElements = driver.findElements(By.tagName(iframe)); System.out.println(iframe List的长度是:+iframeElements.size()); driver.switchTo().frame(0); driver.
linux 防误删机制脚本 1.1 背景介绍 linux系统下,经常有运维或者开发误删除,所以写了个脚本,防止误删除操作 简单思路就是创建个隐藏文件夹,用mv脚本替换rm命令
2.1 脚本详情 cat <<'EOF_INSTALL' > /usr/bin/rm_safely.sh #!/bin/bash # Created: Zhaoping.lu, 2021.12 # Purpose: # A replacement for rm command. Will move the target files into ~/.trash/trash_<time_flag> instead rm. # And the trash folders elder than specified days will be pruged. # Changes # V1, 20211222, Created. KEEP_DAYS=7 #文件保留天数 TRASH_BASE_DIR=$HOME/.trash function usage() { cat <<EOF2022 Usage: rm FILE... Move files into $TRASH_BASE_DIR instead of deleting them.
AnsiString str=adsfaga; try { int v=str.ToInt(); } catch(...) { } 上面的代码,在C++ Builder 10 和 11中,开发64位程序会出现内存泄漏的情况。解决办法只有用UnicodeString代替AnsiString,或者使用StrToInt函数或者StrToFloat
首先介绍一下大概情况:在客户局域网内安装了一个应用系统,是web项目,近期需要需要提供压力并发测试报告,要求是:非服务器电脑上测试,单个用户持续访问5分钟,100用户并发访问5分钟;结果要求在样本足够多(万为单位)的情况下,异常率小于1%,且平均值大于100(还不懂平均值是啥)。
项目使用JDK+Tomcat+SSH来开发的,于是使用Apache Jmeter进行测试,遇到以下几个问题:
1、服务器日志报错:Caused by: java.sql.SQLException: We are already in the process of making 11 connections and the number of simultaneous builds has been throttled to 10
百度:https://www.matools.com/blog/190118426 simultaneous-build-throttle: 这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线程并不是立即响应 连接请求的,默认是10。
解决方案:
在proxool.xml中增加: <simultaneous-build-throttle>20</simultaneous-build-throttle> 默认 <simultaneous-build-throttle>10</simultaneous-build-throttle>
本项目是在applicationContext-Hibernation.xml中配置的数据库连接,具体参数是:(调到20后又报错,最后调到了50)
<!-- 可一次建立的最大连接数(默认10个) --> <property name=simultaneousBuildThrottle > <value>50</value> </property> 2、报错:日志报错信息:2022-04-26 14:09:52,035 ERROR JDBCExceptionReporter:234 - Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186647040)(ERR=12518)(ERROR_STACK=(ERROR=(CODE=12518)(EMFI=4))(ERROR=(CODE=12560)(EMFI=4)))),
并且在连数据库连不上:
百度:网上有的说是连接数据库的SID不对,但是本项目是正常访问一会让后报错,于是pass调
Redis的五种数据结构: 字符串:zhangsan 20 true string 单key:单value: username:zhangsan age:20 list列表: 13900009999
[email protected] 321321 list 单key:多有序value: contacts:13900009999,xxx,xxxx set集合: beijing shanghai chongqing tianjin set 单key:多无序value:city:bj sh cq tj pojo: id:1001,name:zhangsan,age:20 hash 单key: 对象(属性:值):student:id:1001,name:zhangsan,age:20 zset 单key:多有序vlaue: city:1000 tj,1200 cq,1500 sh,2000 bj redis中有关key的操作命令: 查看数据库中的key:keys pattern |->*:匹配0个或者多个字符 |->?: 匹配1个字符 |->[]:匹配[]里边的1个字符 keys *:查看数据库中所有的key keys k*:查看数据库中所有以k开头的key keys h*o:查看数据库中所有以h开头、以o结尾的key keys h?o: 查看数据库中所有以h开头、以o结尾的、并且中间只有一个字符的key keys h[abc]llo:查看数据库中所有以h开头以llo结尾,并且h后边只能取abc中的一个字符的key 判断key在数据库中是否存在:exists key 如果存在,则返回1;如果不存在,则返回0 exists key [key key .
描述写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始
示例:假设 nowcoder.txt 内容如下:ab
c
d
e
f
你的脚本应当输出:357910
方法1:for循环遍历+判断【不对】
#!/bin/bash let j=0 for i in `cat nowcoder.txt` do let j++ if [[ i -eq ]];then echo $j fi done 方法2:while循环,用箭头传递数据,read 文件
【-z $i表示i对应的内容为空】
#!/bin/bash let j=1 while read i do if [[ -z $i ]]; then echo $j fi let j++ done < nowcoder.txt 【使用==直接判空】
#!/bin/bash let j=1 while read i do if [[ $i == '' ]]; then echo $j fi let j++ done < nowcoder.
killall 进程名pid='ps gaux | grep smonsvr | grep -v grep | awk '{print $2}''kill -9 &pid
如何kill掉进程名包含某个字符串的一批进程:kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')
观测进程名包含某个字符串的进程详细信息:top -c -p $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n'
','|sed 's/,$/\n/')
shell下通过进程名字杀掉该进程想到的方法就是把进程全部列出,然后搜索进程名字得到pid
后,用kill -9 pid 杀掉。
具体指令就是:
pid='ps gaux | grep smonsvr | grep -v grep | awk '{print $2}''kill -9 &pid
**:如果使用阿里云linux服务器 1.设置容器镜像服务 在阿里云平台搜索 “容器镜像服务”
选择“CentOS”
安装/升级Docker客户端
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { registry-mirrors: [https://03eun7m7.mirror.aliyuncs.com] } EOF sudo systemctl daemon-reload sudo systemctl restart docker OK! 一、安装docker 1. 安装一组工具 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 2. 设置 yum 仓库地址 sudo yum-config-manager \ --add-repo \ http://mirrors.
DROP PROCEDURE IF EXISTS test; CREATE PROCEDURE test() #创建存储函数; BEGIN DECLARE i INT DEFAULT 1; WHILE i < 20 DO INSERT INTO `t_test_auto`(`id`, `name`,`age`) VALUES ('1'+i,'haha',ROUND((7+RAND()*6),2)); SET i = i+1; end WHILE; END; CALL test();#调用存储函数