SupCube

  • 主页
  • 随笔
所有文章 友链 关于我

SupCube

  • 主页
  • 随笔

Dapper事物操作

2019-06-30

Dapper是一种轻量级的ORM框架,具有高效便捷等特点所以很受广大开发者的厚爱。特别是他的自动映射功能小编真的爱不释手。
但是之前开发项目大都是简单操作最近在开发过程中需要用到同时操作一些列sql命令。因此“事物”成了救命稻草。
总结代码如下:

public class Test
{
    /// <summary>
    /// 提供数据库连接
    /// </summary>
    /// <returns></returns>
    public static IDbConnection GetConnection()
    {
        return new SqlConnection("server=....;database=...;uid=...;pwd=...");
    }
    /// <summary>
    /// 测试事物接口
    /// </summary>
    /// <returns></returns>
    public bool FuncTest()
    {
        //第一条sql
        string sql1 = "select max(id) from table1";
        //第二条命令
        string sql2 = "xxxxxxxxx";
        using (IDbConnection conn = GetConnection())
        {
            conn.Open();
            IDbTransaction transaction = conn.BeginTransaction();
            try
            {
                conn.ExecuteScalar<int>(sql1, null, transaction);
                conn.ExecuteScalar<int>(sql2, null, transaction);
                //提交前就可以事物提交多个操作
                transaction.Commit();
                return true;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                return false;
            }
        }
    }    
}

总结如下:
1.启用事物前打开链接;
2.依次执行多个操作;
3.执行之后要提交;
4.失败之后要回滚;
5.使用事物要谨慎因为会对表加锁影响吞吐量;

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

C# Lock 字符串

2019-07-01

最近在开发项目中遇到了需要防止某个人的操作并发的问题,因此考虑到加锁;
问题来了:
如果只是对需要操作的地方 加全局锁,必然影响系统整体吞吐量;
代码如下:

class Test
{
    private static object objlock = new object();
    public void FuncA(string usercode)
    {
        lock(objlock)
        {
            //执行操作
        }
    }
}

这样固然可以但是发现所有的用户共用了一把锁,严重影响吞吐量于是决定优化。决定每人一把锁,
修改代码如下:

  class Test
{
    public void FuncA(string usercode)
    {
        lock(usercode)
        {
            //执行操作
        }
    }
}

但是经过测试锁定无效,并发问题仍然存在,后来经过排查发现问题之所在lock锁定字符串每个字符串再内存中都是一个不同的对象,类似于每人都有一把锁。这当然起不到加锁的目的,经过查阅资料修改代码如下:

  class Test
{
    public void FuncA(string usercode)
    {
        lock(string.Intern(usercode))
        {
            //执行操作
        }
    }
}

经过测试发现问题解决。string.Intern 内部是实例化一个池子如果字符串值一致则系统就不会实例化,直切取出对象,因此问题解决;

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

Redis命令

2019-07-01

1.基于内存的key-value数据库
2.基于c语言编写的,可以支持多种语言的api //set每秒11万次,取get 81000次
3.支持数据持久化
4.value可以是string,hash, list, set, sorted set

使用场景

  1. 去最新n个数据的操作
  2. 排行榜,取top n个数据 //最佳人气前10条
  3. 精确的设置过期时间
  4. 计数器
  5. 实时系统, 反垃圾系统
  6. pub, sub发布订阅构建实时消息系统
  7. 构建消息队列
  8. 缓存

cmd访问redis
redis-cli.exe -h 127.0.0.1 -p 6379

key
keys * 获取所有的key
select 0 选择第一个库
move myString 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动
flush db 清除指定库
randomkey 随机key
type key 类型

set key1 value1 设置key
get key1    获取key
mset key1 value1 key2 value2 key3 value3
mget key1 key2 key3
del key1   删除key
exists key      判断是否存在key
expire key 10   10过期
pexpire key 1000 毫秒
persist key     删除过期时间

string
set name cxx
get name
getrange name 0 -1 字符串分段
getset name new_cxx 设置值,返回旧值
mset key1 key2 批量设置
mget key1 key2 批量获取
setnx key value 不存在就插入(not exists)
setex key time value 过期时间(expire)
setrange key index value 从index开始替换value
incr age 递增
incrby age 10 递增
decr age 递减
decrby age 10 递减
incrbyfloat 增减浮点数
append 追加
strlen 长度
getbit/setbit/bitcount/bitop 位操作

hash
hset myhash name cxx
hget myhash name
hmset myhash name cxx age 25 note “i am notes”
hmget myhash name age note
hgetall myhash 获取所有的
hexists myhash name 是否存在
hsetnx myhash score 100 设置不存在的
hincrby myhash id 1 递增
hdel myhash name 删除
hkeys myhash 只取key
hvals myhash 只取value
hlen myhash 长度

list
lpush mylist a b c 左插入
rpush mylist x y z 右插入
lrange mylist 0 -1 数据集合
lpop mylist 弹出元素
rpop mylist 弹出元素
llen mylist 长度
lrem mylist count value 删除
lindex mylist 2 指定索引的值
lset mylist 2 n 索引设值
ltrim mylist 0 4 删除key
linsert mylist before a 插入
linsert mylist after a 插入
rpoplpush list list2 转移列表的数据

set
sadd myset redis
smembers myset 数据集合
srem myset set1 删除
sismember myset set1 判断元素是否在集合中
scard key_name 个数
sdiff | sinter | sunion 操作:集合间运算:差集 | 交集 | 并集
srandmember 随机获取集合中的元素
spop 从集合中弹出一个元素

zset
zadd zset 1 one
zadd zset 2 two
zadd zset 3 three
zincrby zset 1 one 增长分数
zscore zset two 获取分数
zrange zset 0 -1 withscores 范围值
zrangebyscore zset 10 25 withscores 指定范围的值
zrangebyscore zset 10 25 withscores limit 1 2 分页
Zrevrangebyscore zset 10 25 withscores 指定范围的值
zcard zset 元素数量
Zcount zset 获得指定分数范围内的元素个数
Zrem zset one two 删除一个或多个元素
Zremrangebyrank zset 0 1 按照排名范围删除元素
Zremrangebyscore zset 0 1 按照分数范围删除元素
Zrank zset 0 -1 分数最小的元素排名为0
Zrevrank zset 0 -1 分数最大的元素排名为0
Zinterstore
zunionstore rank:last_week 7 rank:20150312 rank:20150324 rank:20150325 weights 1 2 1 2 1 2 1
排序:
sort mylist 排序
sort mylist alpha desc limit 0 2 字母排序
sort list by it:* desc by命令
sort list by it:* desc get it:* get参数
sort list by it:* desc get it:* store sorc:result sort命令之store参数:表示把sort查询的结果集保存起来

订阅与发布:
订阅频道:subscribe chat1
发布消息:publish chat1 “hell0 ni hao”
查看频道:pubsub channels
查看某个频道的订阅者数量: pubsub numsub chat1
退订指定频道: unsubscrible chat1 , punsubscribe java.* 订阅一组频道: psubscribe java.*

redis事物:
隔离性,原子性,
步骤: 开始事务,执行命令,提交事务
multi //开启事务
sadd myset a b c
sadd myset e f g
lpush mylist aa bb cc
lpush mylist dd ff gg

服务器管理
dump.rdb
appendonly.aof
//BgRewriteAof 异步执行一个aop(appendOnly file)文件重写
会创建当前一个AOF文件体积的优化版本

//BgSave 后台异步保存数据到磁盘,会在当前目录下创建文件dump.rdb
//save同步保存数据到磁盘,会阻塞主进程,别的客户端无法连接

//client kill 关闭客户端连接
//client list 列出所有的客户端

//给客户端设置一个名称
  client setname myclient1
  client getname

 config get port
 //configRewrite 对redis的配置文件进行改写

rdb
save 900 1
save 300 10
save 60 10000

aop备份处理
appendonly yes 开启持久化
appendfsync everysec 每秒备份一次

命令:
bgsave异步保存数据到磁盘(快照保存)
lastsave返回上次成功保存到磁盘的unix的时间戳
shutdown同步保存到服务器并关闭redis服务器
bgrewriteaof文件压缩处理(命令)

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

Sqlserver操作提示主体“dbo”不存

2019-06-20

开发过程中遇到数据库问题:
比如备份数据库之后,导入新库中打不开:提示

“无法作为数据库主题执行,因为主体 “dbo”不存在……”

这一般都是权限问题:

解决方案如下:

选择“数据库”,右键,选择“属性”,选择“文件”页,点击“所有者”右侧按钮,点击“浏览”按钮,选择当前登录用户即可解决;

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

C#多线程Thread-Task-Parallel用法

2019-06-20

大家在开发过程中,往往会为了提高用户体验,某些功能会采用异步进行。譬如:一个定时服务,以及用户登录日志等。这些操作在执行过程中用户不需要要等待其执行结束。对此引入了多线程处理方式。在此小编就之前用过的几种方式总结下;

1.Thread用法:
Thread是多线程最基本的操作方式;

using System;
using System.Threading;
namespace TestSupCube
{
class TestSuper
{
  static void TestThread()
  {
   //执行一些列操作  
  }
  static void Main(string[] args)
  {
      Thread mthread = new Thread(TestTrhead);
      mthread.Start();
      Console.WriteLine("SupCube Test Thread");
      Console.ReadLine();
  }
}
}

1.需要首先定义方法。
2.实例化线程引用该方法;
3.启动线程;

2.Task用法:Task是Thread的封装因此用法 几乎一样:

using System;
using System.Threading.Tasks;
namespace TestSupCube
{
class TestSuper
{
    static void TestTask()
    {
     //执行一些列操作  
    }
    static void Main(string[] args)
    {
    Task mtask = new Task(TestTask);
    mtask.Start();
    Console.WriteLine("SupCube Test Task");
    Console.ReadLine();
    }
}
}

=============================缺省方法如下:=====================================

   static void Main(string[] args)
{
    Task mtask = new Task(() =>
        {
            //执行一些列操作  
        });
    mtask.Start();
    Console.WriteLine("SupCube Test Thread");
    Console.ReadLine();
}

Task是支持多核的因此如果是多核cpu效率很高很多;
3.Parallel用法:

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace TestSupCube
{
class TestSuper
{
    static void TestTask(int num)
    {
        //执行一些列操作  
    }
    static void Main(string[] args)
    {
        List<string> listtask = new List<string>() { 1, 2, 3, 4, 5 };
        Parallel.ForEach(listtask, new ParallelOptions
        {
            MaxDegreeOfParallelism = 3//开启线程数
        },
        x =>
        {
            TestTask(x);
        });
        Console.WriteLine("SupCube Test Parallel");
        Console.ReadLine();
    }
}
}

Parallel适用于:
并行处理多个作业,内部支持线程数控制;

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

SQL Server创建事务

2019-06-29

BEGIN TRAN Tran_Money –开始事务

DECLARE @tran_error int;
SET @tran_error = 0;
BEGIN TRY
UPDATE tb_Money SET MyMoney = MyMoney - 30 WHERE Name = ‘刘备’;
SET @tran_error = @tran_error + @@ERROR;
–测试出错代码,看看刘备的钱减少,关羽的钱是否会增加
–SET @tran_error = 1;
UPDATE tb_Money SET MyMoney = MyMoney + 30 WHERE Name = ‘关羽’;
SET @tran_error = @tran_error + @@ERROR;
END TRY

BEGIN CATCH
PRINT ‘出现异常,错误编号:’ + convert(varchar,error_number()) + ‘,错误消息:’ + error_message()
SET @tran_error = @tran_error + 1
END CATCH

IF(@tran_error > 0)
BEGIN
–执行出错,回滚事务
ROLLBACK TRAN;
PRINT ‘转账失败,取消交易!’;
END
ELSE
BEGIN
–没有异常,提交事务
COMMIT TRAN;
PRINT ‘转账成功!’;
END

  • 已发布
  • 取消发布
  • 修改

展开全文 >>

加载更多
京公网安备11011102002544 © 京ICP备2024068849号-1
智汇魔方:http://www.supcube.com
  • 所有文章
  • 友链
  • 关于我
  • 切水果
  • json格式化
  • 自动分组
  • 集合差集